設計模式 觀察者模式的三種實現

2021-09-25 09:41:49 字數 1869 閱讀 8280

最簡單的語言和**實現來講解觀察者設計模式

稍微探索一下它在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 具體目標 ...