1. 观察者模式:解耦与通知的艺术
第一次接触观察者模式是在一个电商项目的订单系统重构中。当时我们需要实现用户下单后自动触发库存扣减、优惠券核销和物流通知等功能,最初的方案是在订单创建成功后直接调用各个模块的接口。这种强耦合的设计导致每次新增通知类型都要修改订单核心代码,直到一位资深工程师建议:"这个场景用观察者模式更合适"。
观察者模式(Observer Pattern)是行为型设计模式中最常用的模式之一,它定义了对象间一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会自动收到通知并更新。就像订报纸的场景——报社(被观察者)维护着订阅者(观察者)列表,每天新报纸出版时会自动派送给所有订阅者,而订阅者不需要主动询问报纸是否准备好。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模式结构与核心组件
2.1 UML类图解析
标准的观察者模式包含以下核心角色:
code复制+----------------+ +-------------------+
| Subject | | Observer |
+----------------+ +-------------------+
| +attach(o) |<>---->| +update() |
| +detach(o) | +-------------------+
| +notify() | ^
+----------------+ |
^ |
| |
+-----+--------+ +--------+--------+
| ConcreteSubject| | ConcreteObserver |
+---------------+ +------------------+
| +getState() | | +update() |
| +setState() | +------------------+
+---------------+
2.2 角色职责详解
Subject(被观察者):
- 维护观察者列表(List
) - 提供attach/detach方法管理观察者
- 状态变更时调用notify方法通知所有观察者
ConcreteSubject(具体被观察者):
- 维护具体业务状态(如订单状态)
- 状态变更时触发父类notify方法
Observer(观察者接口):
- 定义update方法接口(也可包含subject参数)
ConcreteObserver(具体观察者):
- 实现update方法定义具体响应逻辑
- 可保存对subject的引用以获取更多状态
关键设计原则:Subject只依赖Observer抽象,不关心具体实现。这是松耦合的关键。
3. 多种语言实现方案
3.1 Java标准库实现
Java在java.util包中内置了观察者模式实现:
java复制// 被观察者继承Observable类
class OrderSystem extends Observable {
private String status;
public void setStatus(String newStatus) {
this.status = newStatus;
setChanged(); // 标记状态已改变
notifyObservers(newStatus); // 推模式通知
}
}
// 观察者实现Observer接口
class InventoryObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("库存系统收到订单状态更新:" + arg);
// 具体业务逻辑...
}
}
// 使用示例
OrderSystem order = new OrderSystem();
order.addObserver(new InventoryObserver());
order.addObserver(new CouponObserver());
order.setStatus("PAID");
注意:Java 9开始Observable被标记为@Deprecated,推荐自行实现观察者模式。
3.2 C++实现要点
cpp复制#include <vector>
#include <algorithm>
class Observer {
public:
virtual ~Observer() = default;
virtual void update(const std::string& message) = 0;
};
class Subject {
std::vector<Observer*> observers_;
public:
void attach(Observer* o) {
observers_.push_back(o);
}
void detach(Observer* o) {
observers_.erase(std::remove(observers_.begin(), observers_.end(), o));
}
void notify(const std::string& msg) {
for (auto* o : observers_) o->update(msg);
}
};
// 具体观察者示例
class LogObserver : public Observer {
void update(const std::string& msg) override {
std::cout << "[LOG] " << msg << std::endl;
}
};
3.3 C#事件机制实现
C#提供了语言级的事件支持,本质是类型安全的观察者模式:
csharp复制public class OrderEventArgs : EventArgs {
