资讯专栏INFORMATION COLUMN

[译] 设计模式:发布/订阅模式解析

niuxiaowei111 / 2431人阅读

摘要:发布订阅者模式实现了松耦合你可以让发布者发布消息,订阅者接受消息而不是寻找一种方式把两个分离的系统连接在一起。这会导致恶意的消息被发布,订阅者能够获得他们以前并不能获得的消息。发布订阅模式例子

原文:Design Patterns:PubSub Explained

介绍

这个模式用来作为中间人,一个把发布者和订阅者架接在一起的代理。发布者是当完成某些过程的时候触发事件的对象,订阅者是希望当发布者发布的时候希望被通知的对象。

生活中有一个很好地例子,广播电台,人们会把频道调到他们最喜欢的节目。广播站不知道观众听得是什么或者他们正在听什么。他只需要发布他们的节目就可以啦。观众也不知道广播站制作节目的过程。他们只要在他们最喜欢的节目运行的时候把台调到对应的频道或者告知朋友就行。

发布/订阅者模式实现了松耦合:你可以让发布者发布消息,订阅者接受消息而不是寻找一种方式把两个分离的系统连接在一起。

优势

松耦合

发布者不需要知道订阅者的数量,订阅者听得话题或者订阅者是通过什么方式运行的。他们能够相互独立地运行,这样就可以让你分开开发这两部分而不需要担心对状态或实现的任何细微的影响。

可扩展性

发布/订阅模式可以让系统在无论什么时候无法负载的时候扩展

更干净地设计

充分地利用好发布/订阅模式,你不得不深入地思考不同的组件是如何交互的。这通常会让我们有更干净地设计因为我们对解耦和松耦合的强调。

灵活性

你不需要担心不同的组件是如何组合在一起的。只要他们共同遵守一份协议

容易测试

你可以很好地找出发布者或订阅者是否会得到错误的信息

缺点

发布/订阅模式最大的有点是解耦,但同时也是最大的缺点:

中间人也许不会通知系统消息传送的状态。所以我们无法知道消息传送是成功的还是失败的。紧耦合是需要保证这一点的。

发布者不知道订阅者的状态,反之亦然,这样的话,你根本不知道在另一端是否会没有问题?

随着订阅者和发布者数量的增加,不断增加的消息传送回导致架构的不稳定,容易在负载大的时候出问题

攻击者(恶意的发布者)能够入侵系统并且撕开它。这会导致恶意的消息被发布,订阅者能够获得他们以前并不能获得的消息。

更新发布者和订阅者的关系会是一个很难的问题,因为毕竟他们根本不认识对方。

需要中间人/代理商,消息规范和相关的规则会给系统增加一些复杂度

结论

现实没有银弹,但是这个模式是设计松耦合系统的很好地方式。这和RSS,Atom和PubSubHubbub的思想一样。

发布/订阅模式例子(Javascript)

var makePubSub=function(){
    var callbacks={},
    publish=function(){
        //Turn arguments object into real array
        var args=Array.prototype.slice.call(arguments,0);

        //Extract the event name which is the first entry
        var ev=args.shift();

        //Return if callbacks object doesn"t contain
        //any entry for event
        var list,i,l;
        if(!callbacks[ev]){
            return this;
        }
        list=callbacks[ev];

        //Invoke the callbacks,passing in the rest of parameters
        for(i=0,l=list.length;i           
               
                                           
                       
                 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86135.html

相关文章

  • [] 你应了解的4种JS设计模式

    摘要:尽管特定环境下有各种各样的设计模式,开发者还是倾向于使用一些习惯性的模式。原型设计模式依赖于原型继承原型模式主要用于为高性能环境创建对象。对于一个新创建的对象,它将保持构造器初始化的状态。这样做主要是为了避免订阅者和发布者之间的依赖。 2016-10-07 每个JS开发者都力求写出可维护、复用性和可读性高的代码。随着应用不断扩大,代码组织的合理性也越来越重要。设计模式为特定环境下的常见...

    awokezhou 评论0 收藏0
  • 】RabbitMQ系列(三) - 发布/订阅模式

    摘要:发布订阅模式在之前的文章里,创建了。我们称之为发布订阅模式。其实我们是用到了默认的,用空字符串来标识。空字符串代表了没有名字的被路由到了由指定名字的。和这种关系的建立我们称之为从现在开始这个就会将推向我们的队列了。 发布订阅模式 在之前的文章里,创建了work queue。work queue中,每一个task都会派发给一个worker。在本章中,我们会完成完全不一样的事情 - 我们会...

    WrBug 评论0 收藏0
  • []简单的用javascript实现的数据双向绑定

    摘要:许多流行的框架,像或者都会把双向数据绑定作为其中的主要特性来宣传。尽管有好多种方式去实现这几点,一种简单高效的方法是我们通过发布订阅者模式来实现。方法很简单我们可以使用定制的属性作为代码中需要绑定的属性。 原文:Easy Two-Way Data Binding in Javascript 双向数据绑定指的是当对象的属性发生变化时能够同时改变对应的UI,反之亦然。换句话说,如果我们有一...

    pf_miles 评论0 收藏0
  • []为什么前端初学者必须要明白发布订阅模式

    摘要:应用需要正确并合适响应各种网络请求用户操作计时事件和各种延时动作。好了,我们的新流程图画出来了提示城市名称查找不是很复杂,谷歌地图为此提供了非常简单的。形象点表示就是,函数是一等公民。 By Hubert Zub | Oct 3, 2018 原文 当你将关注点从样式,美学和网格系统转移到逻辑,框架和编写JavaScript代码时。一切都开始了,你会发现你处于你的web开发历程中最激动人...

    miqt 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<