设计模式之观察者

观察者模式介绍

观察者又名事件订阅者、监听者。

观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象事件发生时通知多个“观察者”该对象的其他对象。

通知

目标:拥有一些值得关注的状态的对象。

发布者:它要自身的状态改变通知其他对象。

订阅者:希望关注发布者状态变化的其他对象。

观察者模式的发布者类添加订阅机制,每个对象都能订阅或取消订阅发布者事件流。

  • 一个用于存储订阅者对象引用的列表成员变量。

  • 几个用于添加或删除该列表中订阅者的共有方法。

  • 所有订阅者都必须实现同样的接口,发布者仅通过该接口与订阅者交互。(接口中必须声明通知方法及其参数)。

观察者模式结构

  • 1、发布者

会向其他对象发送值得关注的事件。事件会在发布者自身状态改变或执行特定行为后发生。发布者中包含一个允许新订阅者加入或退出的机制。

当新事件发生时,发送者会遍历订阅列表并调用订阅者对象的通知方法。

  • 2、订阅者接口

声明了通知接口,该接口包含一个update(更新)方法。通过该方法来传递事件的详细信息,方法中可拥有多个参数。

  • 3、具体订阅者

声明了订阅者接口,可以执行一些操作来回应发布者的通知。(所有具体订阅者都实现了同样的接口,发布者不需要与具体类相耦合)

有时还需要一些上下文信息来处理更新信息。这块可通过参数来传递上下文。

  • 4、客户端

分别创建发布者和订阅者,然后为订阅者注册发布者更新。

应用场景

1、 当一个对象状态的改变需要通知或改变其他对象,或一些被动消息接收时,可使用观察者模式。

2、 当应用中的某些对象必须观察其他对象时。

实现方式

  • 1、对业务进行拆分,一个为独立于其他代码的核心功能作为发布类;一个则为必须受到通知的订阅类

  • 2、声明订阅者和发布者接口,并在接口中定义一些必要的方法。

  • 3、确定存放实际订阅列表的位置并实现订阅方法。

  • 4、创建具体发布者类;在具体订阅者类中实现通知更新的方法。

  • 5、客户端必须生产所需的全部订阅者,并在相应的发布者处完成注册工作。

满足开闭原则;可以在运行时建立对象之间的联系。

Demo

观察者模式提供一种作用于任何实现了订阅者接口的对象的机制,可对其事件进行订阅和取消订阅。

阳光报社是一家在当地经营好多年的报社,以前都是报社将印刷好的报纸投放到各个报亭,供想买报纸的人进行挑选阅读,或者买报人可以直接去报社进行购买。随着科技的发展,电子邮箱越来越普及。人们可以按照自己的要求订阅和取消订阅,来查看各个报社的报纸新闻。

这个模式正好可以用我们学习的观察者模式来实现。那么接下来就让我们看看到底如何实现报社发报,订阅的人们可以收到报纸。

订阅者接口和实现

订阅者接口和实现

发布者接口和实现

发布者接口和实现

客户端测试

客户端测试
输出结果

当发布者中的随机数为2时,A和B订阅者都收到了消息,当随机数为4时,且B取消了订阅,A和B都不满足条件,都没有收到消息。

学习了解下来,其实观察者模式理解起来不难,很容易就可以熟悉。后面就需要大家在业务逻辑中,当遇到满足可以使用观察者模式的业务时,可以采用此模式。

其实我感觉,这个模式叫做观察者模式不是很清晰,不能很好的表达其含义,应该叫订阅者模式,这样才能让人第一眼知道它是干什么的。

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

原创不易,给个关注。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发  谢谢。

- END -

往期推荐

设计模式总览

设计模式之简单工厂

设计模式之抽象工厂

设计模式之建造者

设计模式之原型

设计模式之单例

设计模式之适配器

设计模式之桥接

设计模式之组合

设计模式之装饰器

设计模式之外观

设计模式之享元

设计模式之代理

设计模式之责任链

设计模式之命令

设计模式之迭代器

设计模式之中介者

设计模式之备忘录

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

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

相关文章

热姜水的神奇妙用

人们通常会在着凉以后,泡一壶姜茶来喝,来预防感冒,其实热姜水除了这个作用以外还有几大作用的。     醉酒 用热姜水代茶饮用,可消化体内酒精。脚臭 热姜水中加点盐和醋,浸泡双脚15分钟左右,脚臭便可消…

二面京东被问到Java 反射,我直呼好家伙,这我不是必过吗?

二面京东被问到Java 反射,我直呼好家伙,这我不是必过吗?用多久我会升职加薪、当上技术总监、迎娶漂亮学姐、走上人生巅峰!想想还有点小激动。 好了开始分享面试经历 说说你反射的理解 到底什么是反射呢??…

通用路由封装(GRE)×××配置

本人没有很好的文采,只能直接配置,有不懂的地方,后面可以联系我,在配置当中,我会尽量在配置命令后面加标注。1、在R1上配置相关的命令R1(config)#int fa0/0 ---进入以太网fa0/0接口--R1&#…

数字怎么横 竖排_从这些数字更深入了解打包箱房

很多人对于彩钢房和一般瓦楞版集装箱活动房可能比较了解,但是对于打包箱房就相对了解甚少,这里通过一组数字来告诉大家,打包箱房到底怎么样?一、打包箱房标准房子的标准为外部(3米X 6米X2.7米)、内部是(2.83米X5.83米X2.52米)二、…

gridview DataFormatString

转有个时间要在gridview中显示,但是保持着数据库中的是标准时间,很长,而且只需要显示日期,就想要格式化字符串,可是设置了DataFormatString就是不起作用,后来一查,原来要设置"行为"中HtmlEncode false DataFormatString"{0:格式字符串}" 在DataFormatStri…

太神奇了!使用C#实现自动核验健康码:(1)二维码识别

前言因为疫情的原因,无论是进入商场还是医院、车站,都需要出示健康码。现在基本都是采取人工方式核验健康码,看到绿码就通过,否则就禁止进入。但是,单靠人工核验健康码容易造成人员拥堵,增加病毒交叉感染的…

三角形中惊现叛徒!自己胖的像个球,却能成就世界上最快的赛车引擎......

全世界只有3.14 % 的人关注了青少年数学之旅一日,理科生上山寻访禅师。理科生问禅师:“大师,世人为何总嫌我棱角太突出,不合群!”禅师思索一阵,掏出数根圆柱铺在地上,在上面搁了一块木板&#x…

无线专业术语

1. IEEE 802.11b IEEE 802.11b是IEEE(电气和电子工程师协会)1999年9月推出的一个无线局域网标准,采取2.4GHz频段,传输速率最高11Mbps。 2 IEEE 802.11g IEEE 802.11g是IEEE 802.11b标准的继承者,它提供高达54M…

Primes on Interval

AC代码&#xff1a; #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn 1001000; #define inf (1<<29) //上面的位运算还真心没有看懂 // p[i] is i-th primes position b…

我丢,去面试初级Java开发岗位,被问到泛型?

1、泛型的基础概念 1.1 为什么需要泛型 List list new ArrayList();//默认类型是Objectlist.add("A123");list.add("B234");list.add("C345");System.out.println(list);for(int i0;i<list.size();i){//若要将list中的元素赋给String变量&a…

xp下设置文件的权限(转)

第一步&#xff1a; 1&#xff0c;我的电脑&#xff0d;&#xff0d;工具&#xff0d;&#xff0d;文件夹选项&#xff0d;&#xff0d;查看 去掉”使用简单文件共享”的选中状态&#xff0e;确定 第二步&#xff1a; 右击 D 盘 &#xff0d;&#xff0d; 安全 &#xff0d;&am…

echart 地图 某个地区_中国饮食地图来袭!你爱的口味暗藏健康隐患吗?

食&#xff0c;既是人生存之根本&#xff0c;也是人们热爱生活的体现。中国地域广阔、物产富饶&#xff0c;中国人对“吃”看重也愿钻研&#xff0c;种种因素造就了中国美食 “百花齐放”的局面&#xff0c;在“吃货”眼里&#xff0c;中国地图俨然就是一张美食地图。不同地区的…

面试官:实现一个带值变更通知能力的Dictionary

如题&#xff0c; 你知道字典KEY对应的Value什么时候被覆盖了吗&#xff1f;最近大家都在追.Net6 update&#xff0c;咱还是保持节奏&#xff0c;通用语言聊技术。没背景说个铲铲上文中 数据获取组件维护了业务方所有(在用)的连接对象&#xff0c;DBA能在后台无侵入的切换备份库…

颠覆认知!完美赌徒,到底是如何用数学打造经济神话?!

▲ 点击查看说起世界上最会赚钱的数学家&#xff0c;非詹姆斯西蒙斯莫属。1938年&#xff0c;西蒙斯出生于美国的马萨诸塞州&#xff0c;是一个鞋厂的儿子。在其他的孩子&#xff0c;还在听童话故事的时候&#xff0c;西蒙斯就已经开始展露出惊人的数学天赋了。3岁的时候&…

数据源的配置和使用 视频下载

[浪曦][原创][A362]数据源的配置和使用(BLing原创)&#xff0c;请用迅雷下载&#xff0c;可能需要注册&#xff01; 包括servlet调用数据源&#xff0c;spring调用数据源转载于:https://blog.51cto.com/huqianhao/955256

ubuntu apt-get常用命令

常用的APT命令参数   apt-cache search package 搜索包   apt-cache show package 获取包的相关信息&#xff0c;如说明、大小、版本等   sudo apt-get install package 安装包   sudo apt-get install package - - reinstall 重新安装包   sudo apt-get -f ins…

abs函数的使用方法 oracle_SQL Server 常用函数使用方法

1、SubString()&#xff1a;用于截取指定字符串的方法。该方法有三个参数&#xff1a;参数1&#xff1a;用于指定要操作的字符串。参数2&#xff1a;用于指定要截取的字符串的起始位置&#xff0c;起始值为 1 。参数3&#xff1a;用于指定要截取的长度。select substring(abcde…

高考落榜怎么办,奉劝学弟学妹们一些事情,请一定要擦亮眼睛

在目前这个社会情况Java技术是当前社会的一个热门专业&#xff0c;无论是pc端还是移动端对java的需求都是最多的&#xff0c;大学生学java正好顺应时代的发展&#xff0c;不仅有钱途还有前途&#xff0c;Java也适合零基础的人学习。 最近看见一句话 高考不努力&#xff0c;学习…

url地址传参中文乱码处理

1.将字符串转码&#xff1a;new String(“xxxxx”.getBytes("iso-8859-1"),"utf-8") 这种转码方式有很大的弊端&#xff0c;因为它是使用指定的字符集将此String 编码为 byte 序列&#xff0c;并将结果存储到一个新的 byte 数组中&#xff0c;然后…

神仙打架!一人公开单挑全欧洲数学家,却惨遭4位数学家大反转,66年的难题被一晚破解......

全世界只有3.14 % 的人关注了青少年数学之旅两点之间直线最短&#xff0c;这家喻户晓的数学名言&#xff0c;就算是学渣也能倒背如流。但学渣们不知道的是&#xff0c;这条直线并不是最快的。为了让学渣们真正理解这句话&#xff0c;今天&#xff0c;超模君决定科普一波起源关于…