[设计模式] ------ 观察者模式和他的升级版发布订阅模式

概念

观察者模式,原理很简单,把A类的子类分别注入到B类中,通过用B类调用方法,循环调用A类的方法,就是所谓观察者模式

伪代码如下,最快的速度理解观察者模式:

接口 A{// 观察者接口notify();
}
Class A1 extend A{// 等待被调的接口notify(){// A1类特有的实现println(A1被通知);}
}
Class A2 extend A{notify(){println(A2被通知);}
}
Class B{List<A> alist;addA(A a){//将观察者注入到B中alist.add(a);}void notify(){for(A a : alist){// 循环通知每一个A的实现对象a.notify();}}
}
Class Test{main方法(){// 定义通知者BB b = new B();// 将两个观察者A1,A2注册到B中b.addA(new A1());b.addA(new A2());// 当B发出通知后,就会循环调用那些曾经在自己这里注册过的观察者b.notify();}
}

观察者使用场景

上面的伪代码,是最简单的观察者模式的原型。
观察者模式一般用于一个变化(B的notify方法)要引起多个变化(A的notify方法)的场景。比如我执行完一个操作后,需要同时执行好几个方法。

举个例子:消息通知

当系统生成一条消息后,需要同时发送系统消息,邮件消息,短信消息,甚至以后还会有其他类型的消息。
那就可以搞个消息的父类A,定义好发送接口notify。
后面每种消息都是A的子类,然后有着自己的发消息的不同实现。
然后搞个发消息的类B,提前将A的这些子类注册给B,当系统产生消息的时候,只需要调用B的发送,就可以将消息发给各个地方了。

再举个例子:地主剥削

地主就是那个通知者
所有长工都是观察者
每个长工,都要观察地主的命令。比如地主说打扫卫生,然后在地主那里注册的所有长工,都开始打扫卫生。如果新来了长工,那就在地主那里注册下,下次地主再发命令,新来的长工也就和之前的长工一样了。

观察者的优缺点

优点:解耦了观察者,可以很容易的新增多个观察者。
缺点:观察者和通知者耦合,就是上面伪代码中,A和B是耦合的。

为了解决这个缺点,于是有了观察者模式的升级版:发布订阅模式

发布订阅模式

发布订阅模式,一听都比较熟悉,因为我们用的mq就是基于发布订阅模式
发布订阅模式,就是观察者模式的增强版。
哪里增强了呢?我们知道观察者模式中,观察者和通知者是耦合的,是不能随意更换的。那发布订阅模式就是解了这种耦合。
将以前的通知者,叫发布者
将以前的观察者,叫订阅者
然后发布者和订阅者中间有个第三方,记录发布者和订阅者的关系,即谁订阅了谁
那么从此发布者和调用者,就不用互相耦合了。

除了mq,简单的还可以研究下google的eventbus,可以参考我之前的一篇文章,有现成的能运行的例子,可以去感受一下。
spring boot 整合 谷歌guava的EventBus 实现单机版的消息发布订阅

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

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

相关文章

[设计模式] ------ 工厂方法模式

工厂方法模式 手机厂造手机&#xff0c;肥皂厂造肥皂&#xff0c;药品厂造药品。 假设有一大类对象A1,A2,A3,A4…他们都有一个共同的父类A A1可以想成是手机&#xff0c;A2可以想成肥皂… &#xff08;下面例子的A1Factory就是手机厂&#xff0c;A2Factory就是肥皂厂&#x…

[设计模式] ------ 抽象工厂模式

抽象工厂模式 抽象工厂模式&#xff0c;就是对工厂方法模式加以改进而已&#xff0c;其实就是用简单工厂模式的套路创建各个工厂&#xff0c;后面和工厂模式就一模一样了。 其实就是相当于将创建哪个工厂的权利再次放给调用端。 调用端在调用的时候&#xff0c;指定用哪个工厂…

[设计模式] ------ 对比总结:简单工厂模式、工厂方法模式、抽象工厂模式

三个概念&#xff1a; 简单工厂模式&#xff1a;就是一个简单的工厂类&#xff0c;根据不同的入参类型&#xff0c;返回不同的父类引用的子类对象。 工厂方法模式&#xff1a;就是将生成哪个子类对象的过程&#xff0c;延迟到工厂子类实现&#xff0c;工厂父类只定义接口。 抽…

[设计模式] ------ 原型模式(浅拷贝和深拷贝)

原型模式 原型模式就是使用复制对象&#xff0c;创建出新的对象&#xff0c;并且不需要知道创建的细节&#xff08;比如类的属性的赋值等等&#xff09;。 基本使用&#xff08;浅拷贝&#xff09; 常见的就是使用Object的clone方法。需要让类实现Cloneable并重写clone方法&…

机器学习笔记(了解)

1、概念 机器学习&#xff0c;就是通过历史数据找出一定的规律&#xff0c;并使用这些规律对将来不确定的场景进行决策。 机器学习VS数据分析 数据分析&#xff0c;是人为的从历史交易数据中找规律&#xff0c;从而决策。 机器学习&#xff0c;是机器使用算法&#xff0c;从…

机器学习笔记(常见算法)

C4.5 属于决策树算法&#xff0c;既可以解决分类问题&#xff0c;也可以解决回归问题&#xff0c;属于有监督算法。 现在基本不用这个算法了。 K-Means 属于聚类算法&#xff0c;属于无监督算法 SVM&#xff08;*&#xff09; 支持向量机。 曾经一度认为是分类效果最好的算…

赶紧看一下mysql8.0版本的新特性,你的数据库是不是该升级了

这里写目录标题前言mysql8.0的新特性1、账户安全2、优化器索引2.1、隐藏索引&#xff08;invisible&#xff09;2.2、降序索引2.3、函数索引3、SQL语句增强4、新增数据分析函数5、InnoDB增强5.1、优化了一些元数据文件5.2、将系统表mysql和数据字典表&#xff0c;全部改为InnoD…

ThreadLocal不仅要应付面试,更要真的理解,真的会用

前言 记得我几年前第一次面试的时候&#xff0c;就是被问了这个&#xff0c;记得面试官直接就让我说说ThreadLocal的实现原理以及平时有没有见过哪些地方用到了。 我当时初入职场&#xff0c;还是一个大菜鸟&#xff0c;所以直接就被干蒙了&#xff0c;至今还记忆犹新。 闲来…

秒杀业务的基础点

秒杀的是一个很常见的业务了。就是在某个时刻&#xff0c;让大量用户抢购少量的优惠的商品&#xff0c;从而达到商品曝光和电商网站的曝光&#xff0c;增大用户流量&#xff0c;从而提升整体销售额。 比如今年疫情下&#xff0c;各大电商网站&#xff0c;就针对口罩开展了秒杀…

随想,产品思维和开发思维

有时候&#xff0c;产品思维和开发思维&#xff0c;由于出发点的不同&#xff0c;会产生较大的分歧。 作为一个开发&#xff0c;不仅要有自己的思维&#xff0c;也要了解产品的思维&#xff0c;这样才能在和产品的撕逼的战斗中所向披靡&#xff0c;百战百胜。 举个例子&#x…

Base64编码的原理与常用实现

这篇主要是为了后面好介绍加密算法&#xff0c;做的铺垫。 这个是基础&#xff0c;什么是一个程序员的涵养&#xff0c;这些基础就是涵养。 平时可能用不到&#xff0c;但必须得会。 如果连这个原理都说不上来&#xff0c;就别玩王者荣耀绝地求生英雄联盟和平精英了&#xff0c…

MD5算法原理与常用实现

目录定义MD5特点常见应用场景1、校验文件的完整性2、存储用户密码原理1、填补信息2、拿到初始值3、真正的计算MD5为什么不可逆java实现和使用定义 MD全称Message-Digest&#xff0c;即信息摘要&#xff0c;所以MD家族的算法也叫信息摘要算法 MD家族有MD2、MD3、MD4、MD5&#…

SHA算法原理与常用实现

看本文前&#xff0c;最好先看看之前的这一篇关于MD5算法的介绍。 MD5算法原理与常用实现 本文目录定义MD5和SHA-1的碰撞问题常见应用场景1、类似MD5的应用场景2、比特币3、https签名算法会用到SHA-256算法原理1、填补信息2、拿到初始值3、真正的计算java实现和使用定义 SHA算…

MAC算法原理与常用实现

看本文前&#xff0c;最好先看看之前的对于MD5算法和SHA算法的介绍。 本文目录定义常见应用场景1、linux客户端&#xff1a;SecureCRT2、Google身份验证器3、银联pos机终端原理java实现和使用定义 MAC&#xff08;Message Authentication Codes&#xff09;&#xff0c;是一种…

对称加密算法原理与常用实现

目录定义常用对称加密算法DES3DESAESPEB常用对称加密算法的java实现DES实现3DES实现AES实现PEB实现定义 原文通过加密秘钥生成密文&#xff0c;密文通过解密秘钥得到原文。 对于加密秘钥和解密秘钥是相同的算法&#xff0c;就叫对称加密算法。 常用对称加密算法 DES Data E…

面试 HTTP ,99% 的面试官都爱问这些问题

HTTP 和 HTTPS 的区别HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol)&#xff0c;HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范HTTP 主要内容分为三部分&#xff0c;超文本&#xff08;Hypertext&#xff09;、传输…

非对称加密算法 --- RSA签名算法

目录RSA原理RSA应用场景RSA加密场景RSA签名场景RSA加解密和签名算法的java实现RSA原理 通过一定的规则&#xff0c;生成公钥和私钥&#xff0c;公钥和私钥总是成对出现。 公钥可以公开出去&#xff0c;任何人都可以知道。 私钥只有自己知道。 RSA算法能保证&#xff0c;公钥加…

@JsonFormat失效解决

先说结论 JsonFormat失效&#xff0c;换成JSONField就好了 问题经过和原理 JsonFormat作为Date类型的属性值&#xff0c;返回前端格式化处理&#xff0c;很方便。 比如&#xff1a; JsonFormat(pattern "yyyy/MM/dd HH:mm:ss")private Date updateTime;返回给前端…

如何在摆摊经济中脱颖而出

最近&#xff0c;摆摊经济开始火了起来&#xff0c;于是各路诸侯纷纷举起大旗开始摆摊。我周围也不乏有亲朋好友蠢蠢欲动&#xff0c;有的甚至已经初有规模。但这波摆摊风是否真的可行&#xff0c;对谁可行&#xff0c;有哪些风口&#xff0c;有哪些坑&#xff0c;我们慢慢分析…

java 实现 生成短链接服务

java实现短链接转换服务 类似上图这种短信&#xff0c;对应的就是一个短链接。 看到原理也不难&#xff0c;于是先写个最简易版的玩玩&#xff0c;以后有需求了再补充吧 下面是一个简易版的短链接生成代码 搭个spring-boot服务&#xff0c;复制这两个controller&#xff0c;就…