关于观察者模式这一篇就够了

观察者模式的概念

观察者模式(Observer Pattern)是一种软件设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有依赖它的观察者对象,使它们能够自动更新自己。观察者模式又被称为发布-订阅模式、模型-视图模式、源-监听器模式或从属者模式。

观察者模式的优缺点

优点

  1. 降低对象之间的耦合性:观察者模式是一种松散的耦合模式,它让主题和观察者之间实现了松散的耦合关系。这样可以使得两者可以独立地改变和复用。
  2. 支持广播通信:主题对象可以同时通知多个观察者对象,而不需要知道这些观察者对象的具体数量或类型。
  3. 符合开闭原则:可以在不修改主题对象和观察者对象源代码的前提下,通过增加新的观察者类型或主题类型来扩展系统的功能。

缺点

  1. 性能问题:如果主题对象有很多的直接和间接的观察者对象,那么在主题对象状态发生变化时,通知所有的观察者对象会花费很多时间。
  2. 循环依赖:如果观察者对象和主题对象之间存在循环依赖关系,那么当主题对象状态发生变化时,可能会导致系统崩溃。
  3. 无法知道观察目标的变化细节:观察者模式只通知观察者目标对象发生了变化,但没有提供相应的机制让观察者知道目标对象是怎么发生变化的。

观察者模式的应用场景

  1. 事件处理:在图形用户界面(GUI)框架中,按钮的点击事件、窗口的打开和关闭事件等都可以使用观察者模式进行处理。
  2. 消息通知:在聊天应用、社交媒体平台等需要实时消息传递的场景中,可以使用观察者模式实现消息的发布和订阅。
  3. 股票市场:股票市场中的行情变化可以看作是一个主题对象,而各个投资者可以看作是观察者对象。当行情发生变化时,可以通知所有的投资者进行更新。
  4. 日志记录:在实时日志记录系统中,日志记录器可以看作是被观察者对象,而日志分析器、报警系统等可以看作是观察者对象。当日志发生变化时,可以通知这些观察者对象进行相应的处理。

观察者模式的代码实现

在Java中,可以使用接口和类来实现观察者模式。下面是一个简单的示例代码:

// 定义主题接口
public interface Subject {
void registerObserver(Observer o); // 注册观察者
void removeObserver(Observer o); // 移除观察者
void notifyObservers(); // 通知所有观察者
// 其他业务方法...
}
// 定义观察者接口
public interface Observer {
void update(String message); // 更新方法,接收主题对象发送的消息
}
// 具体主题类
public class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private String state; // 主题状态
// 注册观察者
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
// 移除观察者
@Override
public void removeObserver(Observer o) {
observers.remove(o);
}
// 通知所有观察者
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(state);
}
}
// 其他业务方法...
public void setState(String state) {
this.state = state;
notifyObservers(); // 状态变化时通知所有观察者
}
}
// 具体观察者类
public class ConcreteObserver implements Observer {
private String name; // 观察者名称
public ConcreteObserver(String name) {
this.name = name;
}
// 更新方法
@Override
public void update(String message) {
System.out.println(name + " received message: " + message);
}
}

在这个示例中,Subject接口定义了主题对象需要实现的方法,包括注册观察者、移除观察者和通知所有观察者。Observer接口定义了观察者对象需要实现的方法,即更新方法。ConcreteSubject类实现了Subject接口,并维护了一个观察者列表。当主题状态发生变化时,它会调用notifyObservers()方法通知所有观察者。ConcreteObserver类实现了Observer接口,并在更新方法中打印接收到的消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/5768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《基于分形理论的新型电力系统规划场景生成方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Stylus介绍

在计算机科学和Web开发的语境中&#xff0c;“Stylus”通常指的是一种预处理器&#xff0c;它允许开发者使用更高级的语法来编写CSS&#xff0c;并且提供了一些额外的功能来简化和增强CSS的编写过程。Stylus可以编译成普通的CSS&#xff0c;以便浏览器可以解析和应用样式。 St…

一觉醒来 AI科技圈发生的大小事儿 05月01日

⏩OpenAI获《金融时报》内容授权&#xff1a;可训练模型和实时调用 OpenAI与英国《金融时报》达成战略合作伙伴关系&#xff0c;通过将《金融时报》的新闻内容集成到ChatGPT模型中&#xff0c;提升模型的实用性和新闻内容的可访问性。ChatGPT的用户现在能够访问到《金融时报》…

分类规则挖掘(二)

目录 三、决策树分类方法&#xff08;一&#xff09;决策树生成框架&#xff08;二&#xff09;ID3分类方法&#xff08;三&#xff09;决策树的剪枝&#xff08;四&#xff09;C4.5算法 三、决策树分类方法 决策树 (Decision Tree) 是从一组无次序、无规则&#xff0c;但有类别…

审计师能力与专长数据集(2014-2022年)

01、数据介绍 审计师是专门从事审计工作的人员&#xff0c;他们对企业、政府机关、金融机构等组织进行独立的、客观的、合法的审计&#xff0c;以评估这些组织的财务状况、经营绩效和风险水平。审计师通过收集和评估证据&#xff0c;以确定被审计单位的财务报表是否公允、合法…

中国发布首个汽车大模型标准

&#x1f989; AI新闻 &#x1f680; 中国发布首个汽车大模型标准 摘要&#xff1a;中国信息通信研究院于4月28日发布了国内首个汽车大模型标准&#xff0c;标志着汽车行业正式迈向“人工智能&#xff0b;”时代。该标准包含三个核心能力域&#xff1a;场景丰富度、能力支持度…

区块链 | IPFS:CID

&#x1f98a;原文&#xff1a;Anatomy of a CID &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。 1 CID 在分布式网络中与其他节点交换数据时&#xff0c;我们依赖于内容寻址&#xff08;而不是中心化网络的位置寻址&#xff09;来安全地定位…

『项目整理』易CAR通项目说明文档-我的第一款APP

『项目整理』易CAR通项目说明文档-我的第一款APP 项目介绍功能介绍技术栈介绍实现效果如何运行备注 项目介绍 易CAR通项目是我的第一个Android项目。是一款结合了AR技术的模仿懂车帝的看车软件。因为是初学&#xff0c;所示实现的效果差强人意&#xff0c;很多的功能界面只实现…

Git知识点汇总表格总结

Git应该是现在各个做开发公司使用最广泛的版本管理工具了&#xff0c;还有一些公司可能用的SVN&#xff0c;不过总体来说&#xff0c;Git绝对是主流&#xff0c;SVN是集中式版本管理&#xff0c;使用起来相对Git更简单&#xff0c;不过功能相对Git也略显简略&#xff0c;Git的优…

ICode国际青少年编程竞赛- Python-1级训练场-基础训练1

ICode国际青少年编程竞赛- Python-1级训练场-基础训练1 1、 Dev.step(4)2、 Dev.step(-4) Dev.step(8)3、 Dev.turnLeft() Dev.step(4)4、 Dev.step(3) Dev.turnLeft() Dev.step(-1) Dev.step(4)5、 Dev.step(-1) Dev.step(3) Dev.step(-2) Dev.turnLeft() Dev.step(…

Java_从入门到JavaEE_08

一、Eclipse开发工具的介绍 Eclipse工具简绍 Eclipse 是著名的跨平台的自由集成开发环境&#xff08;IDE&#xff09;。最初主要用来 Java 语言开发&#xff0c;但是目前亦有人通过插件使其作为其他计算机语言比如 C 和 Python 的开发工具。 下载与安装 下载&#xff1a; Ecli…

羊大师:羊奶奥秘孩子健康新选择

羊大师&#xff1a;羊奶奥秘孩子健康新选择 羊奶&#xff0c;这个古老而珍贵的营养源&#xff0c;近年来越来越受到家长们的关注。它不仅富含各种营养成分&#xff0c;而且具有独特的消化吸收优势&#xff0c;成为孩子们健康成长的新选择。 羊奶的脂肪球颗粒直径小&#xff0c…

手撕spring框架(3)

手撕spring框架&#xff08;3&#xff09; 相关系列 手撕spring框架&#xff08;1&#xff09; 手撕spring框架&#xff08;2&#xff09; InitializingBean 接口详解 什么是 InitializingBean 接口&#xff1f; InitializingBean 接口是 Spring 框架中的一个接口&#xff0c…

Pandas入门篇(三)-------数据可视化篇3(seaborn篇)(pandas完结撒花!!!)

目录 概述一、语法二、常用单变量绘图1. 直方图&#xff08;histplot&#xff09;2. 核密度预估图&#xff08;kdeplot&#xff09;3. 计数柱状图&#xff08;countplot&#xff09; 三、常用多变量绘图1.散点图(1) scatterplot(2)regplot 散点图拟合回归线(3)jointplot 散点图…

【Flask开发实战】通过python将csv数据导入mysql数据库

一、前言 在前面章节介绍过&#xff0c;我们处理的防火墙规则数据&#xff0c;数据清洗处理后&#xff0c;会产生几类表&#xff0c;以csv形式保存。在接下来的开发测试中&#xff0c;前台页面开始需要用到一些数据&#xff0c;此时我们就需要将csv中数据添加到mysql数据库中。…

fdfs安装启动及性能优化

fsatDFS安装 1、使用 wget 命令下载压缩包&#xff0c;如果没有 wget 命令使用 yum 命令安装 yum install wget 2、下载 fastdfs wget -c “https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz” 3、下载 libfastcommon wget -c “https://github.com/happyfish10…

ELK Stack 8 接入ElasticFlow

介绍 Netflow v5 / v9 / v10&#xff08;IPFIX&#xff09;&#xff0c;支持大部分网络厂商及VMware的分布式交换机。 NetFlow是一种数据交换方式。Netflow提供网络流量的会话级视图&#xff0c;记录下每个TCP/IP事务的信息。当汇集起来时&#xff0c;它更加易于管理和易读。…

什么是红队?

美国国家安全数据遭到攻击数据泄露数据检测和响应&#xff1a;增强威胁情报和事件响应美国国际开发署进行的全球互联网审查人工智能战争的杀戮问题 微信搜索关注公众号&#xff1a;网络研究观&#xff0c;了解获取更多信息。 红队由安全专业人员组成&#xff0c;他们充当克服网…

Linux procinfo命令教程:如何查看和理解系统信息(附案例详解和注意事项)

Linux procinfo命令介绍 procinfo&#xff08;process information&#xff09;是一个简单的命令行工具&#xff0c;用于查看从/proc目录收集的系统信息&#xff0c;并将其美观地格式化输出到标准输出设备。 Linux procinfo命令适用的Linux版本 procinfo命令在大多数Linux发…

Linux 第十八章

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…