觀察者模式定義對象間的一對多依賴:當一個對象(主題/被觀察者)狀態發生改變時,所有依賴它的對象(觀察者)都會收到通知並自動更新。別名:發布-訂閱、模型-視圖、源-監聽器模式。
update()。subject.add(observer) 註冊到主題容器。change()),遍歷容器調用 observer.update(newState)。subject.delete(observer) 取消訂閱。關鍵點:主題依賴抽象 Observer 介面而非具體類,實現鬆耦合、易擴展。
public abstract class AbsRole {
private List<IObserver> observers = new ArrayList<>();
public void add(IObserver observer) { observers.add(observer); }
public void delete(IObserver observer) { observers.remove(observer); }
public void notifyObservers(String newState) {
for (IObserver o : observers) o.update(newState);
}
}
public class Role extends AbsRole {
private String state;
public void change(String newState) {
this.state = newState;
notifyObservers(state); // 狀態變更觸發通知
}
}
public interface IObserver { void update(String newState); }
public class ObserverObj1 implements IObserver {
@Override public void update(String state) {
System.out.println("觀察者1狀態:" + state);
}
}
public class ObserverObj2 implements IObserver {
@Override public void update(String state) {
System.out.println("觀察者2狀態:" + state);
}
}
public class Client {
public static void main(String[] args) {
Role subject = new Role();
subject.add(new ObserverObj1());
subject.add(new ObserverObj2());
subject.change("update!");
// 輸出:觀察者1/2 狀態:update!
}
}
典型應用:GUI 事件監聽、消息隊列消費者、Spring 事件驅動、Redis Pub/Sub。
Java 提供 java.util.Observable (類) 和 java.util.Observer (介面),但因 Observable 是類而非介面,限制復用,現實項目多採用自定義實現或事件總線(如 Guava EventBus、Spring ApplicationEvent)。