發佈訂閱模式與觀察者模式

在開始敲代碼以後,設計模式已經聽了不少,總有一個感受,這是很高大上的東西。其實設計模式不僅是代碼開發在使用,設計模式是一種思想,適用與任何方面。編程

設計模式高尚一點的說法是:軟件設計過程當中針對特定問題的簡潔優雅的解決方案,簡單理解就是:某種場合下針對某個問題的一種解決方案。必定要明白,設計模式並非直接用來完成代碼編寫,是一種思想,不是一種死的機制。不一樣語言對於相同的設計模式有不一樣的實現方法,也有可能並不適用。設計模式

咱們可能在平時的開發中不知不覺就用上了設計模式,只是咱們本身都不清楚,而設計模式也一直在發展,如今已經獲得承認的模式有24種,還有不少模式也被提出,只是還須要時間的檢驗。異步

觀察者模式(Observer Pattern):this

一種一對多的依賴關係,當一個對象發生改變,全部依賴這個對象的都將獲得通知,並更新。觀察者直接訂閱主題,當主題發生變動,直接通知觀察者。spa

發佈訂閱模式(Publish/Subscribe Pattern):prototype

起初發布訂閱模式也叫觀察者模式的別名,慢慢的獨立成一個不一樣的設計模式。訂閱者把想訂閱的事件註冊到中間代理,發佈者發佈事件到中間代理,由中間代理統一發送給訂閱者。設計

觀察者模式的觀察者至關於發佈訂閱模式的訂閱者,二者的最大區別就是發佈訂閱模式有了一箇中間機制。觀察者模式當對象狀態發生改變,直接通知觀察者,因此對象和觀察者是鬆散的耦合在一塊兒的,並且是同步實現。而發佈訂閱模式不須要有任何關聯,是徹底解耦的,都是經過中間機制進行通訊,二者是徹底分離的,因此也是異步實現。3d

先上一個觀察者模式的代碼:代理

function User(name, age) {code

this.name = name;

this,age = age;

this.list = [];
複製代碼

}

User.prototype.subscribe = function (target) {

console.log(this.name + '訂閱了:' + target.name);

target.list.push({target: target.name,user: this.name});

}

User.prototype.publish = function () {

console.log(this.name + '發佈了一條消息');

this.list.forEach((item) => {

console.log('訂閱了' + item.target + '的' + item.user + '收到了這條消息');
複製代碼

});

}

var user1 = new User('用戶1', 18);

var user2 = new User('用戶2', 28);

var user3 = new User('用戶3', 38);

user1.subscribe(user3, user1.name);

user2.subscribe(user3, user2.name);

user3.publish();

//用戶1訂閱了:用戶3

//用戶2訂閱了:用戶3

//用戶3發佈了一條消息

//訂閱了用戶3的用戶1收到了這條消息

//訂閱了用戶3的用戶2收到了這條消息

這就是觀察者模式,觀察者關聯了目標對象(user3),當目標對象發佈消息的時候,會通知給觀察者。

訂閱發佈模式:

var Mit = {

typeList: Object.create(null),

subscribe: function (type, user) {

if(!this.typeList[type]){

  this.typeList[type] = [];

};

this.typeList[type].push({type:type, user: user});
複製代碼

},

publish: function (type, user) {

if(this.typeList[type]){

  for(let item of this.typeList[type]){

     console.log(item.user.name + '接收到了' + user.name + '發佈的' + item.type + '類型新聞');

   }

}
複製代碼

}

}

function User(name) {

this.name = name;
複製代碼

}

User.prototype.publish = function (type, user) {

console.log(this.name + '用戶' + '發佈了' + type + '類型的新聞');

Mit.publish(type, user);

}

User.prototype.subscribe = function (type, user) {

console.log(this.name + '用戶' + '訂閱了' + type + '類型的新聞');

Mit.subscribe(type, user);
複製代碼

}

var user1 = new User('user1');

var user2 = new User('user2');

var user3 = new User('user3');

user1.subscribe('type1', user1);

user2.subscribe('type2', user2);

user3.publish('type1', user3);

//user1用戶訂閱了type1類型的新聞

//user2用戶訂閱了type2類型的新聞

//user3用戶發佈了type1類型的新聞

//user1接收到了user3發佈的type1類型新聞

有一箇中間代理機制,用戶之間只存在發佈和訂閱。

這只是最簡單的兩個模式,關於訂閱發佈模式有個很容易讓人明白的例子,就算售樓的例子,感興趣的能夠去查看看。

其實觀察者模式和發佈訂閱模式究竟是不是同一個的問題,出現了很大的爭議,關鍵在於你怎麼區分設計模式了,是看設計意圖仍是設計結構。若是從結構上看,絕對是不同的,若是是意圖上看,又是同樣的。

對於觀察者模式和發佈訂閱模式大概就理解到這樣的程度了,至於怎麼在編程中使用,就有待商榷了。

相關文章
相關標籤/搜索