1. 观察者模式核心概念解析
观察者模式(Observer Pattern)是软件设计模式中最常用的行为型模式之一,它定义了对象之间的一对多依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,所有依赖于它的观察者都会自动收到通知并更新。
1.1 模式组成要素
观察者模式通常包含以下几个核心角色:
-
Subject(主题/被观察者):维护一个观察者列表,提供添加和删除观察者的方法,以及通知观察者的机制。在JDK实现中对应
Observable类。 -
ConcreteSubject(具体主题):继承自Subject的具体实现,包含具体的业务状态。当状态改变时调用父类的通知方法。
-
Observer(观察者接口):定义观察者的更新接口,通常包含
update()方法。 -
ConcreteObserver(具体观察者):实现Observer接口,在
update()方法中定义具体的响应逻辑。
提示:在Java中实现观察者模式时,
Observable类已经内置了线程安全的观察者管理机制,包括addObserver()、deleteObserver()和notifyObservers()等方法。
1.2 工作流程解析
观察者模式的典型工作流程可以分为以下步骤:
- 注册阶段:观察者通过
addObserver()方法向主题注册自己 - 状态变更:主题内部状态发生变化时,调用
setChanged()标记状态已改变 - 通知阶段:主题调用
notifyObservers()方法遍历所有观察者 - 响应更新:每个观察者的
update()方法被调用,获取最新状态并执行相应操作
java复制// 典型调用序列示例
subject.addObserver(observer); // 注册观察者
subject.setState(newState); // 状态变更触发通知
// -> 自动调用observer.update()
2. JDK内置实现深度剖析
Java在java.util包中提供了观察者模式的默认实现,这为我们快速应用该模式提供了便利,但也存在一些需要注意的实现细节。
2.1 Observable类关键方法
java复制public class Observable {
private boolean changed = false;
private Vector<Observer> observers;
public synchronized void addObserver(Observer o) {
// 线程安全的观察者注册
}
protected synchronized void setChanged() {
changed = true; // 标记状态已改变
}
public void notifyObservers(Object arg) {
// 通知所有观察者(逆序)
}
}
2.2 实现注意事项
-
线程安全机制:
Observable使用synchronized保证线程安全- 观察者列表使用
Vector实现(线程安全的ArrayList) - 通知时采用逆序遍历,避免注册/注销时的并发问题
-
状态变更标记:
- 必须显式调用
setChanged()才会触发通知 - 这种设计允许批量修改后一次性通知
- 通知完成后会自动清除changed标记
- 必须显式调用
-
对象传递方式:
notifyObservers()可以传递任意对象给观察者- 通常传递this引用,让观察者能回查主题状态
注意:从Java 9开始,
Observable类被标记为过时(deprecated),官方推荐使用PropertyChangeListener等更现代的观察者实现方式。
3. 电商系统实战案例实现
让我们通过一个电商订单系统的完整案例,展示观察者模式在实际项目中的应用。
3.1 系统架构设计
mermaid复制classDiagram
class OrderSubject {
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容