观察者模式用于建立对象间一对多的依赖关系。当一个对象(主题)状态改变时,所有依赖它的对象(观察者)都会自动收到通知并更新。
核心组件
-
主题 (Subject)
维护观察者列表,提供注册/注销方法,通知观察者状态变化
javaimport java.util.ArrayList; import java.util.List; public abstract class Subject { private List<Observer> observers = new ArrayList<>(); public void attach(Observer o) { observers.add(o); } public void detach(Observer o) { observers.remove(o); } public void notifyObservers() { for (Observer o : observers) { o.update(); } } }
-
观察者 (Observer)
定义更新接口,接收主题通知
javapublic interface Observer { void update(); }
具体实现示例
主题实现类
java
public class ConcreteSubject extends Subject {
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyObservers(); // 状态变化时通知观察者
}
}
观察者实现类
java
public class ConcreteObserver implements Observer {
private String name;
private ConcreteSubject subject;
public ConcreteObserver(String name, ConcreteSubject subject) {
this.name = name;
this.subject = subject;
subject.attach(this); // 自动注册到主题
}
@Override
public void update() {
System.out.println(name + " 收到更新: 状态值 = " + subject.getState());
}
}
使用示例
java
public class Client {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
new ConcreteObserver("观察者A", subject);
new ConcreteObserver("观察者B", subject);
subject.setState(10); // 触发通知
subject.setState(20); // 再次触发通知
}
}
输出结果
观察者A 收到更新: 状态值 = 10
观察者B 收到更新: 状态值 = 10
观察者A 收到更新: 状态值 = 20
观察者B 收到更新: 状态值 = 20
模式优势
- 松耦合:主题无需知道观察者的具体实现
- 动态关系:可随时添加/删除观察者
- 广播通信:一次状态变化可通知多个对象
- 符合开闭原则:新增观察者无需修改主题代码
典型应用场景
- GUI 事件处理(如按钮点击)
- 消息订阅系统
- 股票价格变动通知
- 游戏中的成就系统
- 分布式系统的状态同步
注意 :Java 内置
java.util.Observable
和Observer
接口已过时(Java 9+),推荐使用自定义实现或java.beans.PropertyChangeListener
替代。