观察者模式(Observer Pattern)是一种行为型设计模式,核心思想是:
“一个对象状态发生变化时,自动通知所有依赖它的对象,而不需要这些对象与之紧耦合。”
下面我从 为什么、是什么、怎么做、代码示例、常见误区 几个方面讲清楚如何用观察者模式解耦。
假设你有一个订单系统:
下单成功 → 发短信
→ 发邮件
→ 更新库存
→ 记录日志
❌ 传统写法(耦合严重):
class OrderService {
public void createOrder() {
// 下单
sendSMS();
sendEmail();
updateInventory();
log();
}
}
问题:
OrderServiceOrderService 知道太多“下游细节”核心思路:
| 角色 | 作用 |
|---|---|
| Subject(被观察者) | 维护观察者列表,状态变化时通知 |
| Observer(观察者) | 定义响应接口 |
| ConcreteSubject | 具体被观察者 |
| ConcreteObserver | 具体观察者 |
public interface Observer {
void onOrderCreated(String orderId);
}
import java.util.ArrayList;
import java.util.List;
public class OrderSubject {
private final List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(String orderId) {
for (Observer observer : observers) {
observer.onOrderCreated(orderId);
}
}
}
public class EmailObserver implements Observer {
@Override
public void onOrderCreated(String orderId) {
System.out.println("发送邮件,订单:" + orderId);
}
}
public class SmsObserver implements Observer {
@Override
public void onOrderCreated(String orderId) {
System.out.println("发送短信,订单:" + orderId);
}
}
public class OrderService {
private final OrderSubject subject;
public OrderService(OrderSubject subject) {
this.subject = subject;
}
public void createOrder() {
String orderId = "123";
System.out.println("订单创建成功");
// 只管通知
subject.notifyObservers(orderId);
}
}
public class Main {
public static void main(String[] args) {
OrderSubject subject = new OrderSubject();
subject.addObserver(new EmailObserver());
subject.addObserver(new SmsObserver());
OrderService service = new OrderService(subject);
service.createOrder();
}
}
✅ OrderService 不再关心谁要处理订单事件
如果你用的是 Spring / 前端 / 后端框架,观察者模式通常直接叫 事件驱动 / 发布订阅。
public class OrderCreatedEvent {
private final String orderId;
public OrderCreatedEvent(String orderId) {
this.orderId = orderId;
}
public String getOrderId() {
return orderId;
}
}
@Service
public class OrderService {
@Autowired
private ApplicationEventPublisher publisher;
public void createOrder() {
String orderId = "123";
publisher.publishEvent(new OrderCreatedEvent(orderId));
}
}
@Component
public class EmailListener {
@EventListener
public void handle(OrderCreatedEvent event) {
System.out.println("发送邮件:" + event.getOrderId());
}
}
✅ 完全解耦 ✅ 可扩展 ✅ 符合企业级架构
| 对比 | 耦合写法 | 观察者模式 |
|---|---|---|
| 调用方式 | 直接调用 | 事件通知 |
| 依赖方向 | 强依赖 | 只依赖接口 |
| 扩展性 | 改代码 | 加观察者 |
| 可测试性 | 难 | 易 |
观察者只做“副作用”,不控制主流程
观察者必须彼此无感知
可改为异步 / 消息队列
✅ 适合:
❌ 不适合:
如果你愿意,我可以:
你更想用在哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。