当前位置: 首页 > news >正文

设计模式——观察者模式

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。

原理

  • 主题(Subject/发布者): 提供注册和移除观察者的接口,并且在自身状态变化时负责通知所有已注册的观察者。
  • 具体主题(Concrete Subject): 具体实现主题类,通常包含具体的业务逻辑及状态,并持有观察者列表。
  • 观察者(Observer): 定义了一个更新接口,当接收到主题的通知时调用此接口进行相应的操作。
  • 具体观察者(Concrete Observer): 实现观察者接口,其中包含了根据主题状态变化需要做出反应的具体方法。

Java代码示例

// 观察者接口
import java.util.ArrayList;
import java.util.List;public interface Observable {void addObserver(Observer observer);void removeObserver(Observer observer);void notifyObservers(String message);
}// 具体主题类
public class NewsAgency implements Observable {private List<Observer> observers = new ArrayList<>();private String news;@Overridepublic void addObserver(Observer observer) {observers.add(observer);}@Overridepublic void removeObserver(Observer observer) {observers.remove(observer);}@Overridepublic void notifyObservers(String message) {for (Observer observer : observers) {observer.update(message);}}public void setNews(String news) {this.news = news;// 发布新消息时,通知所有观察者notifyObservers(news);}
}// 观察者接口
public interface Observer {void update(String message);
}// 具体观察者类
public class Newspaper implements Observer {private String name;public Newspaper(String name) {this.name = name;}@Overridepublic void update(String message) {System.out.println(name + " received news: " + message);// 在这里执行实际的消息处理逻辑}
}// 客户端使用示例
public class Client {public static void main(String[] args) {NewsAgency agency = new NewsAgency();Observer newspaper1 = new Newspaper("The Daily");Observer newspaper2 = new Newspaper("The Times");agency.addObserver(newspaper1);agency.addObserver(newspaper2);agency.setNews("Breaking news!");  // 当发布新消息时,会自动通知所有报纸}
}

想象你是一个新闻机构,有很多家报纸订阅你的新闻。每次有新的新闻时,你需要逐一打电话给每一家报纸告诉他们最新消息。在程序世界里,新闻机构就是“主题”,而各家报纸是“观察者”。当新闻机构有新消息时,只需调用notifyObservers()方法,就像打一圈电话一样,所有订阅的报纸(观察者)就会自动得到通知并更新自己的内容。

应用

  • 事件驱动编程:如GUI应用中按钮点击事件触发的响应处理。
  • 订阅系统:用户订阅新闻、博客或邮件提醒,当有新内容发布时,系统自动发送通知给所有订阅者。
  • 数据同步:多个模块需要共享同一份数据源,当数据源发生变化时,各模块能够及时得到更新。

适用性

  • 当一个对象的改变需要同时改变其他对象,而且不知道具体有多少对象需要改变时。
  • 当一个对象必须通知其他对象,而并不希望指定这些对象或这些对象只知道有改变发生,而不关心如何得知这一改变时。

相关文章:

  • Python进程池multiprocessing.Pool
  • Spring第七天(AOP)
  • Red Hat Enterprise Linux 9.3 安装图解
  • docker 使用 vcs/2018 Verdi等 eda 软件
  • python爬虫案例分享
  • 力扣每日一练(24-1-18)
  • 如何用ArcGIS制作城市用地适应性评价
  • C语言辨析——int a=5;为什么++a=1能编译通过而a++=1不行呢?
  • 在 Python 中实现语音合成的四种方法
  • js监听返回当前页面的方法
  • HCIP-BGP实验3
  • Mysql中的日志系统
  • ChatGPT与文心一言:AI助手之巅的对决
  • 利用appium自动控制移动设备并提取数据
  • 从 GPT1 - GPT4 拆解
  • 【译】JS基础算法脚本:字符串结尾
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • Babel配置的不完全指南
  • javascript 总结(常用工具类的封装)
  • Laravel Telescope:优雅的应用调试工具
  • MaxCompute访问TableStore(OTS) 数据
  • mockjs让前端开发独立于后端
  • node.js
  • PHP变量
  • Python学习之路16-使用API
  • Selenium实战教程系列(二)---元素定位
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • webgl (原生)基础入门指南【一】
  • Zepto.js源码学习之二
  • 给github项目添加CI badge
  • 前嗅ForeSpider教程:创建模板
  • 入手阿里云新服务器的部署NODE
  • 使用putty远程连接linux
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #HarmonyOS:Web组件的使用
  • #QT(一种朴素的计算器实现方法)
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (接口自动化)Python3操作MySQL数据库
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)h264中avc和flv数据的解析
  • (转载)Linux 多线程条件变量同步
  • (转载)PyTorch代码规范最佳实践和样式指南
  • ***测试-HTTP方法
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • ::
  • @DateTimeFormat 和 @JsonFormat 注解详解