2026-02-19 19:47:00
观察者模式(Observer Pattern),又称发布-订阅模式,是一种行为设计模式。它定义了一种一对多的依赖关系,当一个对象(被观察者)的状态发生改变时,所有依赖于它的对象(观察者)都会得到通知并自动更新。
核心机制:
被观察者(Subject):维护一个观察者列表,提供注册、删除和通知观察者的方法。
观察者(Observer):定义一个更新接口,当被观察者状态变化时接收通知。
注册与通知:观察者需向被观察者注册,被观察者在状态变化时遍历观察者列表并调用其更新方法。
代码实现要点:
接口定义:
AbstractObserver:定义观察者行为接口,如action()方法。
AbstractObserverable:定义被观察者接口,包括register()和noticeEvent()方法。
具体实现:
BabyObserverable:实现被观察者接口,使用List存储观察者,实现注册和通知逻辑。
Father、Mather、Sister:实现观察者接口,定义具体行为(如换尿布、喂水、擦汗)。
测试类:
Test:创建被观察者和观察者实例,注册观察者并触发事件,验证模式效果。
实际应用:
事件处理系统:如GUI框架(AWT、Swing)中,按钮点击等事件触发观察者响应。
消息通知:如邮件订阅系统,用户订阅后接收新邮件通知。
分布式系统:如发布-订阅消息中间件(Kafka、RabbitMQ),实现异步通信。
优势:
松耦合:被观察者无需知道观察者具体实现,只需维护列表和通知。
动态关系:运行时灵活添加或删除观察者,增强系统可扩展性。
事件驱动:支持一对多通知,简化事件处理逻辑。
挑战:
性能问题:大量观察者注册时,通知过程可能成为性能瓶颈。
内存泄漏:未正确注销观察者可能导致内存泄漏(如Java中的Observer接口需手动注销)。
通知顺序:观察者执行顺序可能影响结果,需根据业务需求设计。
与其他模式关系:
中介者模式:通过中介者统一管理对象间交互,减少直接依赖。
责任链模式:观察者按顺序处理请求,形成链式结构。
命令模式:将请求封装为对象,支持撤销等操作,与观察者模式结合可实现复杂事件处理。
代码示例解析:
被观察者:BabyObserverable类维护观察者列表,noticeEvent()方法遍历列表并调用action()。
观察者:Father、Mather、Sister类实现action(),定义具体响应行为。
测试流程:创建被观察者和观察者,注册后触发事件,观察者按注册顺序执行行为。
总结:
核心思想:通过定义对象间一对多依赖,实现状态变化时的自动通知。
适用场景:需要对象间松耦合、动态通知或事件驱动的场景。
实现关键:明确被观察者和观察者接口,合理管理注册与通知逻辑。
