什么是发布-订阅模式?
发布-订阅模式又被称为观察者模式,指的是对象间的一种一对多的依赖关系,当对象的状态发生改变是,所有依赖于它的对象都将得到通知。在 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设计模式与开发实践