在開始敲代碼以後,設計模式已經聽了不少,總有一個感受,這是很高大上的東西。其實設計模式不僅是代碼開發在使用,設計模式是一種思想,適用與任何方面。編程
設計模式高尚一點的說法是:軟件設計過程當中針對特定問題的簡潔優雅的解決方案,簡單理解就是:某種場合下針對某個問題的一種解決方案。必定要明白,設計模式並非直接用來完成代碼編寫,是一種思想,不是一種死的機制。不一樣語言對於相同的設計模式有不一樣的實現方法,也有可能並不適用。設計模式
咱們可能在平時的開發中不知不覺就用上了設計模式,只是咱們本身都不清楚,而設計模式也一直在發展,如今已經獲得承認的模式有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類型新聞
有一箇中間代理機制,用戶之間只存在發佈和訂閱。
這只是最簡單的兩個模式,關於訂閱發佈模式有個很容易讓人明白的例子,就算售樓的例子,感興趣的能夠去查看看。
其實觀察者模式和發佈訂閱模式究竟是不是同一個的問題,出現了很大的爭議,關鍵在於你怎麼區分設計模式了,是看設計意圖仍是設計結構。若是從結構上看,絕對是不同的,若是是意圖上看,又是同樣的。
對於觀察者模式和發佈訂閱模式大概就理解到這樣的程度了,至於怎麼在編程中使用,就有待商榷了。