发布-订阅模式

什么是发布-订阅模式?

发布-订阅模式又被称为观察者模式,指的是对象间的一种一对多的依赖关系,当对象的状态发生改变是,所有依赖于它的对象都将得到通知。在 JavaScript 开发中,一般使用事件模型来替代传统的发布-订阅模式。

在生活中,发布订阅模式是非常常见的,例如:在我们取快递的时候,往往是快递到你的那个取货点的时候给你发送了个短信,叫你来取快递,这就是发布-订阅模式。就拿这个例子来说,我们可以把你下的快递比作(订阅),把给你发短信比作(发布)。

一般情况下都是先订阅,再发布,不过在有些特殊的情况下我们可以把顺序颠倒过来。

优点

发布-订阅模式在开发非常的常用,比如写一些发送邮件,短信的业务用到它的几率很大。在从框架上说,如果你阅读学习框架(例如:vue,react等)的源码,这些框架都离不开发布-订阅模式,尤其是关于数据绑定那一部分。

  • 时间上解耦
  • 对象之间的解耦

实例

我们先封装一个发布-订阅模式,下面的代码是一个当我们下单发送短信的代码:

var Event = (function(){

    var cacheList = {},		// 用来保存我们订阅了的方法,
        listen,				// 把我们订阅的方法保存到 cacheList 中
        trigger;			// 发布(触发)我们在 cacheList 中订阅的方法

    listen = function(username,fn){
        if ( !cacheList[username] ) {
            cacheList[username] = [];
        }
        cacheList[username].push(fn);
    }
    trigger = function(){
        var username = Array.prototype.shift.call(arguments),
            fns = cacheList[username];
        if ( !fns || fns.length === 0 ){
            return false;
        }
        for (var i = 0, fn; fn = fns[i++];){
            fn.apply(this,arguments);
        }
    };

    return {						// 形成闭包,返回一个对象,充当接口
        'listen': listen,
        'trigger': trigger,
    }
})()

当我们在淘宝下单的时候我们就使用 listen ,将我们的以后要执行的方法加入到 cacheList

Event.listen('wxid123456789',function(name){
    console.log('您好,亲爱的用户:' + name + ',您的快递到了');
});

我们的取货点的工作人员拿到你的快递,并扫描你的运单号给你发送短信时,这时候就会真正触发该函数

Event.trigger('wxid123456789','小明')

可能你会问,这有什么优势吗?

以下图示是使用传统,这有一个问题如果我的用户业务要扩展功能,或者替换功能怎么办?这要修改起来是非常麻烦,尤其是我们的业务足够的复杂,这种问题尤其突出:

使用 发布-订阅模式可以有效减少耦合,让你的代码更加的明了

参考资料:

  • JavaScript设计模式与开发实践
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值