观测者模式

观测者模式
最新回答
偏爱

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(),定义具体响应行为。

    测试流程:创建被观察者和观察者,注册后触发事件,观察者按注册顺序执行行为。

  • 总结:

    核心思想:通过定义对象间一对多依赖,实现状态变化时的自动通知。

    适用场景:需要对象间松耦合、动态通知或事件驱动的场景。

    实现关键:明确被观察者和观察者接口,合理管理注册与通知逻辑。