1. 观察者模式的核心价值与应用场景
观察者模式是软件设计中一个经典的行为型模式,它定义了对象间一对多的依赖关系。当目标对象(Subject)状态发生改变时,所有依赖它的观察者对象(Observer)都会自动收到通知并更新。这种机制就像订报纸一样——读者订阅后,报社每次出新报纸都会自动派送到每个订阅者家里,而不需要读者每天主动去询问。
在实际开发中,观察者模式特别适合以下场景:
- 用户界面事件处理(如按钮点击触发多个操作)
- 实时数据监控系统(传感器数据变化通知多个显示终端)
- 分布式系统中的事件通知机制
- MVC架构中模型与视图的同步更新
我曾在电商价格监控系统中使用该模式,当商品价格变动时需要同时更新前端展示、触发库存预警和记录价格变更日志。观察者模式让这些操作解耦,新增监听者时完全不用修改核心价格计算逻辑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模式结构与核心组件解析
2.1 经典UML类图实现
标准的观察者模式包含四个关键角色:
- Subject(目标):维护观察者列表,提供添加/删除观察者的方法
- ConcreteSubject(具体目标):实现通知逻辑,状态改变时遍历观察者列表调用其更新方法
- Observer(观察者):定义更新接口
- ConcreteObserver(具体观察者):实现更新逻辑
java复制// 抽象目标类
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();
}
}
}
// 具体目标类
class ConcreteSubject extends Subject {
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyObservers(); // 状态变更时自动通知
}
}
// 抽象观察者
interface Observer {
void update();
}
// 具体观察者
class ConcreteObserver implements Observer {
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject) {
this.subject = subject;
subject.attach(this);
}
@Override
public void update() {
System.out.println("收到状态更新:" + subject.getState());
}
}
2.2 推模型与拉模型的区别
观察者模式有两种实现变体:
- 推模型:Subject将变更数据作为参数直接推送给Observer
- 拉模型:Observer收到通知后主动从Subject拉取所需数据
推模型效率更高但不够灵活,拉模型更通用但可能造成冗余查询。在电商价格监控案例
