范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

发布订阅模式与观察者模式

  背景
  设计模式并非是软件开发的专业术语,实际上,"模式"最早诞生于建筑学。
  设计模式的定义是:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案。通俗一点说,设计模式是在某种场合下对某个问题的一种解决方案。如果再通俗一点说,设计模式就是给面向对象软件开发中的一些好的设计取个名字。
  这些"好的设计"并不是谁发明的,而是早已存在于软件开发中。一个稍有经验的程序员也许在不知不觉中数次使用过这些设计模式。GoF(Gang of Four--四人组,《设计模式》几位作者)最大的功绩是把这些"好的设计"从浩瀚的面向对象世界中挑选出来,并且给予它们一个好听又好记的名字。
  设计模式并不直接用来完成代码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案,他不是一个死的机制,他是一种思想,一种写代码的形式。每种语言对于各种设计模式都有他们自己的实现方式,对于某些设计模式来说,可能在某些语言下并不适用,比如工厂方法模式对于javascript。模式应该用在正确的地方。而哪些才算正确的地方,只有在我们深刻理解了模式的意图之后,再结合项目的实际场景才会知道…
  模式的社区一直在发展。GoF在1995年提出了23种设计模式,但模式不仅仅局限于这23种,后面增加到了24种。在这20多年的时间里,也许有更多的模式已经被人发现并总结了出来,比如一些JavaScript 图书中会提到模块模式、沙箱模式等。这些"模式"能否被世人公认并流传下来,还有待时间验证。观察者模式(Observer Pattern)
  观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。
  观察者模式有一个别名叫"发布-订阅模式",或者说是"订阅-发布模式",订阅者和订阅目标是联系在一起的,当订阅目标发生改变时,逐个通知订阅者。我们可以用报纸期刊的订阅来形象的说明,当你订阅了一份报纸,每天都会有一份最新的报纸送到你手上,有多少人订阅报纸,报社就会发多少份报纸,报社和订报纸的客户就是上面文章开头所说的"一对多"的依赖关系。发布订阅模式(Pub-Sub Pattern)
  其实24种基本的设计模式中并没有发布订阅模式,上面也说了,他只是观察者模式的一个别称。
  但是经过时间的沉淀,似乎他已经强大了起来,已经独立于观察者模式,成为另外一种不同的设计模式。
  在现在的发布订阅模式中,称为发布者的消息发送者不会将消息直接发送给订阅者,这意味着发布者和订阅者不知道彼此的存在。在发布者和订阅者之间存在第三个组件,称为消息代理或调度中心或中间件,它维持着发布者和订阅者之间的联系,过滤所有发布者传入的消息并相应地分发它们给订阅者。
  举一个例子,你在微博上关注了A,同时其他很多人也关注了A,那么当A发布动态的时候,微博就会为你们推送这条动态。A就是发布者,你是订阅者,微博就是调度中心,你和A是没有直接的消息往来的,全是通过微博来协调的(你的关注,A的发布动态)。观察者模式和发布订阅模式有什么区别?
  我们先来看下这两个模式的实现结构:
  观察者模式:观察者(Observer)直接订阅(Subscribe)主题(Subject),而当主题被激活的时候,会触发(Fire Event)观察者里的事件。
  发布订阅模式:订阅者(Subscriber)把自己想订阅的事件注册(Subscribe)到调度中心(Topic),当发布者(Publisher)发布该事件(Publish topic)到调度中心,也就是该事件触发时,由调度中心统一调度(Fire Event)订阅者注册到调度中心的处理代码。
  我们再来看下这两个模式的代码案例:(猎人发布与订阅任务)
  观察者模式: //有一家猎人工会,其中每个猎人都具有发布任务(publish),订阅任务(subscribe)的功能
  //他们都有一个订阅列表来记录谁订阅了自己
  //定义一个猎人类
  //包括姓名,级别,订阅列表
  function Hunter(name, level){
  this.name = name
  this.level = level
  this.list = []
  }
  Hunter.prototype.publish = function (money){
  console.log(this.level + "猎人" + this.name + "寻求帮助")
  this.list.forEach(function(item, index){
  item(money)
  })
  }
  Hunter.prototype.subscribe = function (targrt, fn){
  console.log(this.level + "猎人" + this.name + "订阅了" + targrt.name)
  targrt.list.push(fn)
  }
  //猎人工会走来了几个猎人
  let hunterMing = new Hunter("小明", "黄金")
  let hunterJin = new Hunter("小金", "白银")
  let hunterZhang = new Hunter("小张", "黄金")
  let hunterPeter = new Hunter("Peter", "青铜")
  //Peter等级较低,可能需要帮助,所以小明,小金,小张都订阅了Peter
  hunterMing.subscribe(hunterPeter, function(money){
  console.log("小明表示:" + (money > 200 ? "" : "暂时很忙,不能") + "给予帮助")
  })
  hunterJin.subscribe(hunterPeter, function(){
  console.log("小金表示:给予帮助")
  })
  hunterZhang.subscribe(hunterPeter, function(){
  console.log("小金表示:给予帮助")
  })
  //Peter遇到困难,赏金198寻求帮助
  hunterPeter.publish(198)
  //猎人们(观察者)关联他们感兴趣的猎人(目标对象),如Peter,当Peter有困难时,会自动通知给他们(观察者)
  发布订阅模式: //定义一家猎人工会
  //主要功能包括任务发布大厅(topics),以及订阅任务(subscribe),发布任务(publish)
  let HunterUnion = {
  type: "hunt",
  topics: Object.create(null),
  subscribe: function (topic, fn){
  if(!this.topics[topic]){
  this.topics[topic] = [];
  }
  this.topics[topic].push(fn);
  },
  publish: function (topic, money){
  if(!this.topics[topic])
  return;
  for(let fn of this.topics[topic]){
  fn(money)
  }
  }
  }
  //定义一个猎人类
  //包括姓名,级别
  function Hunter(name, level){
  this.name = name
  this.level = level
  }
  //猎人可在猎人工会发布订阅任务
  Hunter.prototype.subscribe = function (topic, fn){
  console.log(this.level + "猎人" + this.name + "订阅了狩猎" + topic + "的任务")
  HunterUnion.subscribe(topic, fn)
  }
  Hunter.prototype.publish = function (topic, money){
  console.log(this.level + "猎人" + this.name + "发布了狩猎" + topic + "的任务")
  HunterUnion.publish(topic, money)
  }
  //猎人工会走来了几个猎人
  let hunterMing = new Hunter("小明", "黄金")
  let hunterJin = new Hunter("小金", "白银")
  let hunterZhang = new Hunter("小张", "黄金")
  let hunterPeter = new Hunter("Peter", "青铜")
  //小明,小金,小张分别订阅了狩猎tiger的任务
  hunterMing.subscribe("tiger", function(money){
  console.log("小明表示:" + (money > 200 ? "" : "不") + "接取任务")
  })
  hunterJin.subscribe("tiger", function(money){
  console.log("小金表示:接取任务")
  })
  hunterZhang.subscribe("tiger", function(money){
  console.log("小张表示:接取任务")
  })
  //Peter订阅了狩猎sheep的任务
  hunterPeter.subscribe("sheep", function(money){
  console.log("Peter表示:接取任务")
  })
  //Peter发布了狩猎tiger的任务
  hunterPeter.publish("tiger", 198)
  //猎人们发布(发布者)或订阅(观察者/订阅者)任务都是通过猎人工会(调度中心)关联起来的,他们没有直接的交流。
  观察者模式和发布订阅模式最大的区别就是发布订阅模式有个事件调度中心。
  观察者模式由具体目标调度,每个被订阅的目标里面都需要有对观察者的处理,这种处理方式比较直接粗暴,但是会造成代码的冗余。
  而发布订阅模式中统一由调度中心进行处理,订阅者和发布者互不干扰,消除了发布者和订阅者之间的依赖。这样一方面实现了解耦,还有就是可以实现更细粒度的一些控制。比如发布者发布了很多消息,但是不想所有的订阅者都接收到,就可以在调度中心做一些处理,类似于权限控制之类的。还可以做一些节流操作。观察者模式是不是发布订阅模式
  网上关于这个问题的回答,出现了两极分化,有认为发布订阅模式就是观察者模式的,也有认为观察者模式和发布订阅模式是真不一样的。
  其实我不知道发布订阅模式是不是观察者模式,就像我不知道辨别模式的关键是设计意图还是设计结构(理念),虽然《JavaScript设计模式与开发实践》一书中说了分辨模式的关键是意图而不是结构。
  如果以结构来分辨模式,发布订阅模式相比观察者模式多了一个中间件订阅器,所以发布订阅模式是不同于观察者模式的;如果以意图来分辨模式,他们都是实现了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新,那么他们就是同一种模式,发布订阅模式是在观察者模式的基础上做的优化升级。
  不过,不管他们是不是同一个设计模式,他们的实现方式确实有差别,我们在使用的时候应该根据场景来判断选择哪个。

欧盟推进数字化建设来源人民网欧盟委员会日前批准总额约20亿欧元的绿色和数字转型资金,用于完成数字欧洲项目的部分工作计划,重点针对人工智能公共数据空间网络安全和数字技能共享等领域进行战略投资。欧盟20无视美国命令,欧洲芯片巨头加大供货,抢占中国3000亿美元市场如今的美国是想要单边主义一条路走到黑,不仅仅对华为进行了芯片禁令,而且美国真正要打击的是我国的半导体发展,然而对于我国的打压,美国想要置身事外这也是不可能的,无视美国命令,欧洲芯片研究显示城镇化有助于中国实现碳中和据美国科学日报网站2月22日报道,事实证明,中国从农村向城市的大规模移民对中国的碳储量产生了积极影响。城镇化甚至可以在实现气候中和方面发挥作用。报道称,这是丹麦哥本哈根大学研究人员转角双层石墨烯产生超快光电流研究取得进展近期,中国科学院上海光学精密机械研究所强场激光物理国家重点实验室在激光控制转角双层石墨烯产生超快光电流方面取得新进展。相关研究成果发表于PhysicalReviewB上。超快光学技3月1日后,微信支付宝个人收款码可正常使用!2月22日晚间,中国支付清算协会发布关于优化条码支付服务的公告,宣布现行个人收款码不关闭不停用,同时新设个人经营收款码,服务不减体验不变,并可享受更高效的交易对账等服务。随后,微信五JSONPath使用(Java)1。开发环境JDK1。8SpringBoot2。1。182。添加依赖dependencygroupIdcom。jayway。jsonpathgroupIdjsonpathartif饭店洗碗机多少钱?酒店洗碗机的价格主要取决于清洁能力大小选用机型不同清洗原理不同等因素不同机型的商用洗碗机价格也不尽相同,普通的小型揭盖机一万元左右,而清洁效率明显优于揭盖机的通道式洗碗机,价格在3减肥用的体脂称哪个牌子比较好?这里要先想一下对你而言体脂称应该是什么?对我而言,体脂秤是一个方便自己的工具,在这里可以分享我选体脂秤的思路。1。需要能测量体重外的多项身体数据,并可以看到历史报告2。不用每次测量蔚小理,自动驾驶谁第一?文丨深途(IDshentucar),作者丨黎明,编辑丨魏佳2017年的春天,美国得克萨斯美洲赛道,一辆叫作EP9的电动超跑,在无人驾驶测试中跑出了每小时257公里的成绩,成为当时全乌镇互联网赋能美丽城镇建设千年乌镇,水乡画廊。美丽盈乎全域,文旅奏以雅韵。地连江浙,毗邻京杭古运河互联天下,不愧数字先行地。多年来,乌镇始终聚焦一业一网发展,旅游业保持优势地位,互联网产业持续蓬勃发展。经过28岁字节员工确认离世,给互联网打工人的几点警示想必大家都已经知道最近字节发生的员工猝死事件,如果还不知道,先简单回顾一下3月23日,就在上周,网上流传一份微信聊天记录,这份聊天记录,是字条跳动猝死员工的妻子找群友求助的相关内容
MIUI12。5内测开启,支持小米10系列,网友体验后服了在28号小米11发布会上,雷军正式发布MIUI12。5正式版,此前已进开启了内测通道。难倒众人的是MIUI这个内测答题门槛,说实话真的有点烦人,只有回答道80分以上才能申请内测,最雷军化身圆梦达人,话题瞬间引爆微博,网友要不当个网红吧雷军,可谓是互联网中的传奇人物了。作为曾经的金山CEO和现任的小米CEO,雷军一直因为亲民的形象受到网友的欢迎。在互联网上,甚至有许多网友表示,你可以黑小米,但是不能黑雷军。这一点9。39万起售,标配高功率1。5T,车长近4。8米,奕炫MAX值得入手吗?东风风神在众多国产品牌中的存在感不算高,旗下的产品线也不算丰富,比如很长一段时间内,它只有奕炫一款紧凑型轿车,竞争力明显不足,所以为了改善这种现状,东风风神推出了全新紧凑型轿车奕炫成都车展最受关注的中大型MPV,丰田赛那售价曝光,还要加价吗?在2021成都车展上,广汽丰田赛那绝对是最受关注的中大型MPV,它最直接的竞争对手也呼之欲出,那就是别克GL8,一个是北美市场最受欢迎的MPV车型,一个是中国MPV市场的天花板,赛2021成都车展实拍风行T5EVO女神版在2021成都车展上,东风风行带来了风行T5EVO女神版,在女性车主数量不断增长的大环境下,女性专属这个概念也就应运而生,虽说这只是一种营销的噱头。风行T5EVO女神版是基于普通版6。99万起,标配全液晶仪表盘中控大屏车联网,评全新吉利帝豪吉利帝豪是一款十分经典的国产紧凑型轿车,凭借着较高的性价比,每个月的销量都在万台以上。8月28日,全新帝豪正式上市,新车共推出四款车型,价格区间为6。998。89万,下面我们就解析不玩PPT,不割韭菜,售后网点遍布全国,大众ID。4X值得入手吗?这几年,国内汽车市场涌现出了大量造车新势力,而且大部分是互联网公司跨界造车,他们善于玩PPT,甚至做几张图就敢开启盲定,而有些车企在割完一茬韭菜之后就销声匿迹了,所以不管什么时候,新车速递抢先体验十一代本田思域,外观变沉稳,动力有提升日前,东风本田第十一代思域正式亮相,新车采用了最新的家族化设计语言,整体造型要比现款车型沉稳很多,动力也有小幅提升,下面我们就解析一下这款热门车型。外观方面,新车的车头更加扁平化,被误会的3款小米手机!一看价格都看不上,实际上配置堪比旗舰机OPPO和vivo在前几年就有着高价低配的帽子,也被不少网友诟病。但相比之下,也有性价比的机型,那就是小米。最近,我就整理出三款高配低价的机型,而且是千元机,堆料却一个比一个良心。中国手机市场份额制裁之下,荣耀依然超越小米5G时代来临,这是一个万象更新的时代。各家手机厂商如果能够抓紧这次机遇,可以一跃成为全国第一。同样,如果错失这次机遇,那么将被同行打压,沦为小众品牌。那么,在2020年这个5G关键联想太强!小米卖3千块的手机它卖1千多,网友厂长是你表哥?摩托罗拉曾经在国内手机也曾叱咤风云,但随着小米以性价比这一利器崛起,加上其他手机厂商的成长,摩托罗拉的手机业务不断萎缩。后来甚至还把手机业务卖给了联想,近几年也是风声全无。在1月1