觀察者模式定義 一對多 依賴:主體對象狀態變更時,自動通知所有註冊的觀察者對象進行更新。
// 主體介面
public interface ISubject {
void registerObserver(IObserver observer);
void removeObserver(IObserver observer);
void notifyObserver();
}
// 觀察者介面
public interface IObserver {
void remind(ITask taskSubject); // 更新方法
}
// 業務主體介面
public interface ITask {
void setStatus(String status); String getStatus();
void setProcess(String process); String getProcess();
void setCheckList(String checkList); String getCheckList();
}
public class TaskSubject implements ISubject, ITask {
private static List<IObserver> _observers = new ArrayList<>();
private String _status, _process, _checkList;
public void registerObserver(IObserver o) {
if (_observers.contains(o)) System.out.println(o + " already registered");
else { _observers.add(o); System.out.println(o + " registered"); }
}
public void removeObserver(IObserver o) {
if (!_observers.contains(o)) System.out.println(o + " never registered");
else { _observers.remove(o); System.out.println(o + " removed"); }
}
public void notifyObserver() {
for (IObserver o : _observers) o.remind(this);
}
// ITask getter/setter 略...
}
public abstract class TaskObserver implements IObserver {
protected String _status, _process, _checkList;
public void remind(ITask task) {
this._status = task.getStatus();
this._process = task.getProcess();
this._checkList = task.getCheckList();
sendEmail(); // 模擬通知發送
}
public abstract void sendEmail();
protected void print(String msg) { System.out.println(msg); }
}
public class Assignee extends TaskObserver {
public void sendEmail() {
print("[Assignee] Status: " + _status);
print("[Assignee] Process: " + _process);
print("[Assignee] CheckList: " + _checkList);
}
public String toString() { return "Assignee"; }
}
// Reviewer、Reporter 結構同理
public class TaskManager {
public static void main(String[] args) {
TaskSubject subject = new TaskSubject();
IObserver assignee = new Assignee();
IObserver reviewer = new Reviewer();
IObserver reporter = new Reporter();
subject.registerObserver(assignee);
subject.registerObserver(reviewer);
subject.registerObserver(reporter);
subject.setStatus("Assigned");
subject.setProcess("No Process");
subject.setCheckList("CheckList v1.0");
subject.notifyObserver();
subject.setStatus("In Progress");
subject.setProcess("Process Attached");
subject.setCheckList("Final Version");
subject.removeObserver(reporter);
subject.notifyObserver();
}
}
< Assignee > is registered successfully!
< Reviewer > is registered successfully!
< Reporter > is registered successfully!
[Assignee] The current status is : <Assigned>.
[Reviewer] The current status is : <Assigned>.
[Reporter] The current status is : <Assigned>.
< Reporter > is removed successfully!
[Assignee] The current status is : <In Progress>.
[Reviewer] The current status is : <In Progress>.
ISubject、IObserver、ITask 職責單一。