發布訂閱模式的思想是在觀察者模式的基礎上演變而來,在觀察者模式中客戶端監聽到對象某個行為就觸發對應任務程序。而在發布訂閱模式中依然基於這個核心思想,所以有時候也會將兩者認為是同一種設計模式。它們的不同之處在於觀察者模式中的客戶端與服務端是相互耦合的,即服務端對象直接綁定客戶端的監聽任務,客戶端直接綁定監聽服務端的行為。而在發布訂閱模式中,客戶端與服務端是解耦的,它們彼此不相互綁定,兩者的聯系由中間的通道模塊綁定實現連接。發布訂閱模式相對於觀察者模式實現了解耦,相互之間互不干擾。
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");