直接上代码,很简单的两个例子:
// subscribe_publish: 发布订阅模式
// 有一个中间的事件通信通道,订阅者A和发布者B是通过pubsub这个对象关联起来的,他们没有直接的交流。
console.log("pubsub:")
var pubsub = (()=>{
var topics = {};
function subscrbe(topic, fn){
if(!topics[topic]){
topics[topic] = [];
}
topics[topic].push(fn);
}
function publish(topic, ...args){
if(!topics[topic])return;
for(let fn of topics[topic]){
fn(...args);
}
}
return {
subscrbe,
publish
}
})();
pubsub.subscrbe('test', function(a,b){
console.log(a,b);
})
pubsub.publish('test', 'hello','world!');
console.log("-----------------------------");
// observer: 观察者模式
// 一个或多个观察者对目标的状态感兴趣,通过将自己依附在目标对象上以便注册所感兴趣的内容。
// 目标状态发生改变并且观察者可能对这些改变感兴趣,会发送一个通知消息,调用每个观察者的更新方法。
// 当观察者不再对目标状态感兴趣时,他们可以简单将自己从中分离。
console.log("observer:");
class Subject {
constructor(){
this.subs = [];
}
addSubs(sub){
this.subs.push(sub);
}
nodify(){
this.subs.forEach(sub => {
sub.update();
})
}
}
class Observer{
update(){
console.log('update')
}
}
let subject = new Subject();
let ob = new Observer();
subject.addSubs(ob);
subject.nodify();
// 目标和观察者是直接联系在一起的。观察者把自身添加到了目标对象中,可见和发布订阅模式差别还是很大的。
// 在这种模式下,目标更像一个发布者,他让添加进来的所有观察者都执行了update函数,而观察者就像一个订阅者。