设计模式之观察者

观察者模式介绍

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

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

通知

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

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

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

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

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

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

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

观察者模式结构

  • 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,一经查实,立即删除!

相关文章

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

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

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

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

gridview DataFormatString

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

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

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

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

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

我丢,去面试初级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…

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岁的时候&…

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;学习…

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

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

基于事件驱动架构构建微服务第4部分:repositories

原文链接&#xff1a;https://logcorner.com/building-microservices-through-event-driven-architecture-part4-repositories/在本文中&#xff0c;我将实现Repositories的命令端。存储库属于Clean架构的接口适配器在这一步中&#xff0c;我将开始实现基础设施的命令端&#x…

小松

之前做过一次小小的介绍(没看过的请参看此文&#xff1a;闲话小松)&#xff0c;相信不少老朋友应该都知道我是谁了。还不认识我的朋友可以称呼我小松(这名号有年头了&#xff0c;听习惯了^_^)&#xff0c;当然你喜欢怎么喊都成&#xff1a;)偶是个是理想主义的倡导者&#xff0…

vlan后 出现 outlook 正在试图从服务器检索数据

vlan后 出现 outlook 正在试图从服务器检索数据 cisco vlan outlook 正图试从Microsoft Exchange Server 检索数据。cisco 3750 vlan outlook is retrieving data from Microsoft Exchange Server mail.abc.com 最近对公司的网络按需要划分了基出802.1q的VLAN&#xff0c;…

二面京东,面试官直接问我JVM,我心里一阵暗爽~

二面京东&#xff0c;面试官直接问我JVM&#xff0c;我心里一阵暗爽~简直了&#xff0c;hhhh明人不说暗话&#xff0c;直接进入主题&#xff01;&#xff01;&#xff01;一、什么是JVM二、JAVA代码编译和执行过程类加载机制类执行机制三、JVM内存管理和垃圾回收垃圾回收按照基…

最后的代课老师———漆红玉[转]

1月31日凌晨6点我们从渭源县城出发&#xff0c;天还未亮。1月的甘肃干冷干冷的&#xff0c;我们是在半路上接的漆老师&#xff0c;刚开始我以为是寇筱茜老师的一个熟人&#xff0c;路上寇老师才和我说漆老师也是代课老师。寇筱茜老师有一句名言&#xff1a;每一个代课老师都有一…

ae渲染出现错误是什么问题_[Switch]解决OPENWRT路由,使用UU加速器等出现相同IP,DNS解析错误问题...

本文在之上添加DNS解析错误的解决方案解决 NS openwrt路由器 开腾讯 UU之类的加速器无法上网的问题​tieba.baidu.com将子网掩码转换为二进制&#xff0c;即为11111111.11111111.0.0&#xff0c;1有16位&#xff0c;令x16&#xff1b;IP地址若为aaa.bbb.ccc.ddd&#xff0c;设置…

程序员从入门到升级,或许可以看一看这几个公众号

全世界只有3.14 % 的人关注了青少年数学之旅快节奏的现代社会中&#xff0c;每个人都疲于奔命&#xff0c;“丧、累、太难了”已成为成年人的生活主题。难得的闲暇时间&#xff0c;公众号是不可或缺的消遣方式。但我们被海量数据淹没&#xff0c;越来越多的公众号只是消耗情绪&…

C# 向Main函数传递参数(程序启动时传递参数)

代码 staticvoidMain(string[] args) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false);if(args.Length!0) { Application.Run(newF_WebIE(args[0])); }else{ Application.Run(newF_WebIE(null)); } }注意&#xff1a;不能把 参数 s…