当前位置: 首页 > 科技观察

说完观察者和发布订阅模式的区别,面试官不留我吃饭了

时间:2023-03-21 00:28:57 科技观察

说完观察者和发布订阅模式的区别,面试官就不留我吃饭了。转载本文,请联系LoveSmile的架构师公众号。来到心仪已久的公司面试。我刚开门,还没说话,HR小姐姐就问我:你是来面试的吗?我想不对:是不是因为我长得帅,小姐一看就知道我以后就是这栋楼的主人了,所以主动跟我打招呼。我抬起头,微微点头:是。HR小姐:面试官马上就到了,我先带你去会议室。在去会议室的路上,我注意到每个人的脖子上都戴着闪亮的徽章。我下意识地看了看自己的脖子,昨天没有洗澡,除了一点点汗水外什么也没有。原来是因为没带工卡被认出来了,顿时脸就热了。我承认我刚才有点自恋。HR小姐:怎么了,脸怎么红了,不舒服吗?我摸了摸自己的脸:没有,面试有点紧张,很疼。来到会议室,HR小姐姐递给我一杯水:面试官有临时会,请稍等。我:好的。我心里嘀咕:怎么突然开会了?难道是我看了简历觉得自己不行,故意找借口?果然,门开了,一个头发油腻,满脸痘痘的中年男人向我走来。我心想:这不是传说中的建筑师。看来他们还是很看重我的,第一次见面就派了一个架构师给我,我得好好表现。架构师:你是xxx,刚才开会迟到了,下面开始采访,一分钟简单介绍一下自己。果然,我没有猜错。给我一分钟的介绍。还好我按照一分钟前的准备,准备开始背了。我张嘴笑了笑,露出自信的牙齿:尊敬的建筑师,您好,我是xxx,在之前的公司工作……建筑师点点头:很好。我看你简历上写了很多技能,你挑一个你最熟悉的。我有点乱:为什么架构师不按套路,他要问我HashMap的源码,Java锁的机制等等。我想了想我比较熟悉的:Java集合类,JVM、多线程、Spring全家桶。如果我说这些,肯定会被建筑师鄙视。我差点忘了我还有另一个杀手锏:设计模式。我拍拍胸脯:架构师你好,我之前在项目重构中用了很多设计模式,要不你问我设计模式。架构师:那你说说观察者模式和发布-订阅模式的区别吧?脑子里立刻闪过《Head First设计模式》里说的:发布者+订阅者=观察者模式。问这么简单的问题是不是看不起我?我内心很激动,嘴角挂着胜利者的笑容:亲爱的架构师,我之前看过一本书《Head First 设计模式》,里面的观察者模式和发布订阅模式是等价的,是一回事。建筑师也笑了:不,它们不一样。这一刻,我慌了,手有些颤抖,我怎么了,明明是平等的。架构师:我待会儿还有个会,今天的面试你先过来,你先回家等消息吧。回家后心有不甘,决定把观察者模式和发布订阅模式搞清楚。谷歌一顿后,写了如下笔记:观察者模式观察者模式一般有观察者和被观察者。比如:你在学校读书的时候,老师不在的时候,有些人会玩手机,吃零食,和隔壁的小姐姐聊天,但是被老师发现了就不好了,所以我们想一招让坐最后一排的同学帮忙“放气”。老师一来就给大家打了个手势通知大家,大家继续装好学生(哈哈)。这其实就是一个典型的观察者模型。“放风”的同学是被观察者,玩手机、吃零食的同学是观察者。大家都在观察“放风”同学们的手势。一旦老师来了,被观察的每个人都会得到通知。好了,让我们看看UML建模是如何定义的。观察者模式定义了对象之间一对多的依赖关系,这样每当一个对象改变状态时,所有依赖它的对象都会得到通知并自动更新。UML结构图如下:Subject类是一个主题,它将所有对观察者对象的引用文件存储在一个集合中,每个主题可以有任意数量的观察者。它是一个抽象主题,提供了一个接口来添加和删除观察者对象。Observer类是一个抽象的观察者,它为所有具体的观察者定义了一个接口,并在被主体通知时更新自己。ConcreteSubject类是一个具体的主题,它在具体的观察者对象中存储相关状态,当具体主题的内部状态发生变化时,向所有注册的观察者发送通知。ConcreteObserver是一个具体的观察者,它实现了抽象观察者角色所需要的更新接口,从而使自己的状态与主体的状态相协调。发布-订阅模式给出了生活中的例子。比如我们要订阅一本国家地理杂志,一般需要先去邮局申请(付费),告诉邮局我要订阅这本杂志,然后等几天杂志最终被打印出来。现在,这个时候我们不会直接去印刷厂,而是等印刷厂把杂志送到邮局,然后邮局慢慢把杂志送到家里(推送模式),如果你实在是迫不及待跑去邮局直接取杂志。恭喜,你已经学会了“拉模式”。用技术术语来解释发布-订阅模型:订阅者将自己想要订阅的事件注册到调度中心,当事件被触发时,发布者将事件发布到调度中心(带上下文),调度中心统一调度用户注册到调度中心的处理代码。在发布-订阅模式下,发布者并不直接通知订阅者,换句话说,发布者和订阅者之间并不知道对方。发布者和订阅者如何通信?答案是通过中间调度中心。发布者将消息发送给调度中心,告诉它你帮我把消息放到Topic1中。订阅者告诉调度中心我需要订阅topic1,请帮我关注一下。当消息到来时,订阅者可以采用拉取方式或推送方式获取消息。总结一个态度,话不多说,先上一张图:从表面上看:观察者模式只有两种角色:观察者和被观察者。发布-订阅模型中有三种角色:发布者、订阅者、调度者(第三方)。更深入:观察者和被观察者处于松耦合关系中。发布者和订阅者是完全解耦的。从使用层面看:Observer模式通常在单个应用程序中使用。发布-订阅模型更多的是一种跨应用的模式,比如我们常用的消息中间件Kafka。总结一下:观察者模式和发布订阅模式本质上都有发布订阅的思想,但是也有一定的区别,所以我们不能将两者完全划等号。闲聊:冬天来了,一起抱团取暖吧~有什么技术问题或者职业发展问题可以加我个人微信咨询。如果想加入读者群,可以备注“加群”。团里的人都很棒。微信搜索smileCoder1024值得拥有。