设计模式——观察者模式(Observer)

观察者模式(Observer Pattern)是软件设计模式的一种,也被称为模型-视图模式、源-收听者模式或从属者模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象状态发生变化时,它的所有依赖者(观察者)都会自动收到通知并更新。

基本构成

  1. 抽象主题(Subject):维护一个观察者列表,并提供增加、删除和通知观察者的接口。
  2. 具体主题(Concrete Subject):实现了抽象主题接口,并保存了具体状态,当状态发生改变时,会通知所有观察者。
  3. 抽象观察者(Observer):定义了一个更新接口,以便在得到主题状态改变通知时执行相应的操作。
  4. 具体观察者(Concrete Observer):实现了抽象观察者接口,并持有具体主题的引用,以便在主题状态改变时,从主题中获取新的状态数据并执行相应的操作。

优点

  1. 解耦:观察者模式降低了主题与观察者之间的耦合度,两者之间的依赖关系是通过接口实现的,因此主题不知道观察者的具体实现细节,观察者也不需要了解主题的内部状态。
  2. 可扩展性:当需要增加新的观察者时,只需要创建一个新的观察者类并实现观察者接口即可,无需修改原有的代码。
  3. 支持广播通信:观察者模式支持一对多的通信方式,当一个主题状态发生改变时,可以通知所有的观察者。

缺点

  1. 依赖关系没有完全解除:虽然观察者模式降低了主题与观察者之间的耦合度,但它们之间仍然存在依赖关系。如果观察者依赖于主题的某些特定方法或属性,那么当主题发生改变时,可能会影响观察者的正常工作。
  2. 性能问题:当观察者数量较多时,通知的发布可能会花费较长时间,影响程序的性能。
  3. 循环依赖:如果观察者和主题之间存在循环依赖关系,可能会导致系统崩溃。

应用场景

  1. 事件处理系统:如GUI(图形用户界面)中的按钮点击事件、键盘输入事件等。
  2. 实时数据更新:在需要实时更新数据的应用中,如股票市场监测、游戏开发等。
  3. 插件和扩展:许多编程库和框架使用观察者模式来支持插件和扩展,开发人员可以编写自定义观察者以响应库或框架中的事件或回调。
  4. 消息队列系统:生产者将消息发送到队列,而消费者作为观察者订阅队列以接收和处理消息。

实现方式

在实现观察者模式时,需要注意具体主题对象和具体观察者对象之间不能直接调用,否则会使两者之间紧密耦合起来,这违反了面向对象的设计原则。通常的做法是定义一个接口作为两者之间的桥梁,主题对象通过接口来通知观察者对象,而观察者对象也通过接口来接收通知并执行相应的操作。

相关推荐
AI人工智能+电脑小能手2 小时前
大白话说Java设计模式-45-解释器模式(源码剖析篇)
java·设计模式·解释器模式·源码分析·pattern·spel·javacc
码匠许师傅6 小时前
【设计模式精讲】4.单例模式(Singleton)
c++·单例模式·设计模式
雾削木6 小时前
2026 编程领域热点知识速览:AI 辅助开发、设计模式实战与嵌入式高效迭代
人工智能·设计模式
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-42-访问者模式(业务实战篇)
java·spring·设计模式·访问者模式·asm·营销规则·数据结构与操作分离
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-43-访问者模式(源码剖析篇)
java·设计模式·访问者模式·源码分析·elementvisitor·asm classvisitor·spring spel
Michael_lcf2 天前
Agent设计模式:思考-行动-观察循环的本质与局限
设计模式·agent设计模式·agent设计模式的本质
丰锋ff2 天前
设计模式学习笔记
笔记·学习·设计模式
米啦啦.2 天前
设计模式/
观察者模式·单例模式·设计模式·工厂模式
QuZhengRong2 天前
【AI】Agent 全栈进阶|Agent 设计模式
人工智能·学习·设计模式·llm·agent
码匠许师傅2 天前
【设计模式精讲】2. 设计原则基石:SOLID 与几条关键原则
java·设计模式·log4j