发布订阅模式的思想是在观察者模式的基础上演变而来,在观察者模式中客户端监听到对象某个行为就触发对应任务程序。而在发布订阅模式中依然基于这个核心思想,所以有时候也会将两者认为是同一种设计模式。它们的不同之处在于观察者模式中的客户端与服务端是相互耦合的,即服务端对象直接绑定客户端的监听任务,客户端直接绑定监听服务端的行为。而在发布订阅模式中,客户端与服务端是解耦的,它们彼此不相互绑定,两者的联系由中间的通道模块绑定实现连接。发布订阅模式相对于观察者模式实现了解耦,相互之间互不干扰。
1 //发布者 2 let publisher = { 3 data:0, 4 publishTopic:function(event){ 5 let arg = arguments.length > 1 ? Array.prototype.slice.call(arguments,1) : [undefined]; 6 channel.pub(event,...arg); 7 } 8 }; 9 //通道 10 let channel = { 11 events:{}, 12 pub:function(event,arg){ 13 //实现发布 14 if(!this.events[event]){ 15 return; 16 } 17 this.events[event].forEach(ele => { 18 ele(arg); 19 }); 20 }, 21 sub:function(event,callback){ 22 //实现订阅 23 if(!this.events[event]){ 24 this.events[event] = []; 25 } 26 this.events[event].push(callback); 27 } 28 }; 29 //订阅者 30 let subscribe = { 31 subscribeTopics:function(event,callback){ 32 channel.sub(event,callback); 33 } 34 }; 35 36 //订阅 37 subscribe.subscribeTopics("月刊",data =>{ 38 console.log(data); 39 }); 40 //发布 41 publisher.publishTopic("月刊","aaa");