Java 观察者模式详解:核心概念、实现原理与代码示例
观察者模式用于建立对象间的一对多依赖,使主题变化能自动通知所有注册者。本文将深入解析 Java 中的实现方式,包括接口定义、集合管理及完整的测试用例,助力掌握这一经典设计模式。
观察者模式的核心概念
观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,会通知所有注册的观察者对象,使它们能够自动做出相应的响应或更新。
这种模式广泛应用于事件处理系统、GUI 界面开发以及消息推送场景。其核心价值在于实现了“发布-订阅”机制的解耦:主题无需知道观察者的具体实现,只需维护一个观察者列表并统一触发通知。
Java 中的实现架构
在 Java 中实现标准的观察者模式,通常需要定义以下两个关键角色:
- 观察者(Observer):定义更新接口。所有需要接收通知的对象必须实现此接口。
- 被观察者/主题(Subject/Observable):负责管理观察者的注册、移除,并在状态改变时遍历列表进行通知。
第1步:定义观察者接口
首先创建 Observer 接口,确立统一的更新方法签名。这是解耦的关键,确保主题只依赖抽象而非具体类。
/**
* 观察者接口:观察者需实现此接口以接收更新
*/
public interface Observer {
public void update(Object obj);
}
第2步:定义被观察者接口
接着定义 BeenObserved 接口(或称 Subject),包含添加、移除观察者和发送通知的方法。采用接口形式便于后续扩展为抽象类实现。
/**
* 被观察者接口:管理观察者集合及通知分发
*/
public interface BeenObserved {
public void addObserver(Observer obs); // 添加观察者
public void removeObserver(Observer obs); // 移除观察者
public void notifyObservers(String changed); // 触发通知
}
第3步:实现具体主题类
ConcreteWatched 是实现类,内部使用 List<Observer> 维护观察者列表。注意在添加和移除时需检查是否存在,避免重复或空指针异常;通知时则逐个调用更新方法。
/**
* 具体的被观察者实现
*/
public class ConcreteWatched implements BeenObserved {
// 维护观察者集合
private List<Observer> list = new ArrayList<>();
@Override
public void addObserver(Observer obs) {
if (!list.contains(obs)) {
list.add(obs);
}
}
@Override
public void removeObserver(Observer obs) {
if (list.contains(obs)) {
list.remove(obs);
}
}
@Override
public void notifyObservers(String change) {
// 遍历所有观察者并执行更新
for (Observer obs : list) {
obs.update(change);
}
}
}
第4步:实现具体观察者类
具体观察者类实现 Observer 接口,定义接收到通知后的实际业务逻辑。在此示例中,仅打印收到的数据。
/**
* 具体的观察者实现
*/
public class SpecificWatcher implements Observer {
@Override
public void update(Object obj) {
System.out.println("收到通知:" + obj.toString());
}
}
完整测试流程与结果验证
通过 Test 类验证模式的有效性。测试分为两个阶段:先添加三个观察者并触发一次通知,再移除一个观察者后再次触发,观察输出差异。
/**
* 测试入口
*/
public class Test {
public static void main(String[] args) {
// 1. 初始化主题
BeenObserved bObs = new ConcreteWatched();
// 2. 创建并注册三个观察者
Observer obs1 = new SpecificWatcher();
Observer obs2 = new SpecificWatcher();
Observer obs3 = new SpecificWatcher();
bObs.addObserver(obs1);
bObs.addObserver(obs2);
bObs.addObserver(obs3);
// 3. 第一次通知:所有观察者应接收消息
System.out.println("=== 第一次通知 ===");
bObs.notifyObservers("***收到了通知***");
System.out.println("----------分隔线--------------");
// 4. 移除中间观察者
bObs.removeObserver(obs2);
// 5. 第二次通知:只有 obs1 和 obs3 响应
System.out.println("=== 第二次通知 ===");
bObs.notifyObservers("***少了一个观察者***");
}
}
运行上述代码,控制台将按预期输出两次通知结果。第一次包含三条日志,第二次仅包含两条,证明移除操作生效且通知机制正确。
总结与应用建议
观察者模式是实现松散耦合的有力工具。在 Java 开发中,若涉及状态变更广播(如 UI 控件联动、消息队列监听器),可参考此结构。需注意:notifyObservers 应当保持轻量,避免阻塞;若观察者众多,应考虑异步线程池处理以提升性能。
以上就是 Java 观察者模式实现的详细内容,更多关于 Java 设计模式与事件驱动开发的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









