设计模式之:观察者模式
观察者模式简介
观察者模式是一种行为设计模式,定义对象间的一对多依赖关系,使得当一个对象状态改变时,所有依赖它的对象都会自动收到通知并更新。
核心角色
- Subject(主题):维护观察者列表,提供注册、删除和通知观察者的方法。
- Observer(观察者):定义更新接口,供主题通知时调用。
- ConcreteSubject(具体主题):实现主题接口,存储具体状态,状态改变时通知观察者。
- ConcreteObserver(具体观察者):实现观察者接口,处理主题传递的状态更新。
Java实现示例
主题接口与具体主题
import java.util.ArrayList;
import java.util.List;// 主题接口
interface Subject {void registerObserver(Observer o);void removeObserver(Observer o);void notifyObservers();
}// 具体主题
class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();private int state;public int getState() {return state;}public void setState(int state) {this.state = state;notifyObservers(); // 状态变更时通知观察者}@Overridepublic void registerObserver(Observer o) {observers.add(o);}@Overridepublic void removeObserver(Observer o) {observers.remove(o);}@Overridepublic void notifyObservers() {for (Observer o : observers) {o.update(state);}}
}
观察者接口与具体观察者
// 观察者接口
interface Observer {void update(int state);
}// 具体观察者A
class ConcreteObserverA implements Observer {@Overridepublic void update(int state) {System.out.println("ObserverA: Subject's state updated to " + state);}
}// 具体观察者B
class ConcreteObserverB implements Observer {@Overridepublic void update(int state) {System.out.println("ObserverB: Subject's state updated to " + state);}
}
使用示例
public class ObserverPatternDemo {public static void main(String[] args) {ConcreteSubject subject = new ConcreteSubject();Observer observerA = new ConcreteObserverA();Observer observerB = new ConcreteObserverB();subject.registerObserver(observerA);subject.registerObserver(observerB);subject.setState(10); // 触发通知subject.setState(20); // 再次触发通知}
}
Java内置支持
Java提供了java.util.Observable
类和java.util.Observer
接口,但已过时(Java 9标记为废弃),推荐自行实现或使用第三方库(如Guava的EventBus
)。
应用场景
- 事件驱动系统(如GUI按钮点击)。
- 消息队列或发布-订阅模型。
- 数据变化触发多组件更新(如MVC架构)。
优缺点
- 优点:解耦主题与观察者,支持动态添加/删除观察者。
- 缺点:过度使用可能导致复杂性,需注意避免循环依赖。