最簡單的語言和**實現來講解觀察者設計模式
稍微探索一下它在vue中的概念: dep、watcher到底是什麼?
我理解的觀察者模式:
主體有乙個陣列,陣列包含了要被通知的物件。需要通知的時候,遍歷陣列通知他們。就是這麼簡單。。。。
// 主體物件:管理被通知的物件
class subject
add(obj)
noticefy() );
}}// 子物件,擁有乙個update函式
class observe
update() `)
}}var sub = new subject();
var obj1 = new observe('name1')
var obj2 = new observe('name2');
sub.add(obj1)
sub.add(obj2)
sub.noticefy();
突然想到,如果事件多了怎麼辦?給每乙個事件加乙個標記不就解決了! 這就是發布訂閱者實現:
class subject ;
} add(event, obj)
this.obj[event].push(obj)
} noticefy(event) );
}}class observe
update() `)
}}var sub = new subject();
var obj1 = new observe('name1')
var obj2 = new observe('name2');
var obj3 = new observe('name3');
sub.add("event1", obj1)
sub.add("event1", obj2)
sub.add("event2", obj3)
sub.noticefy('event1');
全部都用觀察者本身的update函式,裡面是可以穿引數的啊,如果傳的多就是推模式,如果傳的少就是拉模式。。。
// 推模式,一般把整個物件傳進去
noticefy(event) );
}// 拉模式,一般傳乙個狀態
noticefy(event) );
}
概念雖然又臭又長,但是靜下來多度一下還是豁然開朗的。
觀察者的傳統定義
其中乙個物件(稱為主體)根據它(觀察者)維護乙個物件列表,自動通知它們狀態的任何變化。觀察者中的四個概念: 推拉的概念:
可由 subject 例項在呼叫 update 方法時注入引數實現。按引數資訊量的大小,可分為推模型(push model)、拉模型(pull model)兩類。推模型,subject 將全量資訊注入 update 方法;拉模型,subject 只將少量資訊注入 update 方法,再由 observer 例項獲取 subject 例項的狀態。觀察者和發布訂閱模式的區別:
觀察者中,如果有變化,會立即通知觀察者,並且需要觀察者和訂閱者同時互相繫結。觀察者模式的定義是這樣的: 一對多的依賴關係中,當依賴更新,則依賴它的物件們也更新。所以dep,是依賴dependence的縮寫,也就是目標物件。發布訂閱模式中,訂閱者並不知道是否有觀察者訂閱了事件,更好的解耦。
三種設計模式 單例模式 組合模式 觀察者模式
設計模式 今天我們就聊一下這三個設計模式 單例模式 也就是說,當我們使用建構函式,每一次 new 出來的物件 屬性 功能 方法 完全一樣 的時候,我們把他設計成單例模式 核心 應用 creatediv.prototype.init function text 準備把這個 creatediv 做成單例...
設計模式三 觀察者模式
為什麼使用觀察者模式 觀察者模式和mq訊息訂閱機制很相似,都是當任務來到,然後所有的觀察者收到訊息開始執行,當然有時候沒必要使用mq的時候可以使用觀察者模式 優點 降低了目標與觀察者之間的耦合關係,兩者之間是抽象耦合關係。目標與觀察者之間建立了一套觸發機制。缺點 觀察者多的時候無法削峰填谷,突然很消...
設計模式(三) 觀察者模式
1.定義 2.結構 3.示例 具體 如下 目標標頭檔案 datacenter.h ifndef datacenter h define datacenter h include include include include display.h 抽象目標 class datacenter 具體目標 ...