觀察者模式案例的簡單分析

2022-09-11 19:39:16 字數 2035 閱讀 3486

觀察者模式也叫發布-訂閱模式,其定義如下:定義物件間一種一對多的依賴關係,使得當該物件狀態改變時,所有依賴於它的物件都會得到通知,並被自動更新。

觀察者模式的通知方式可以通過直接呼叫等同步方式實現(如函式呼叫,http介面呼叫等),也可以通過訊息佇列非同步呼叫(同步呼叫指被觀察者發布訊息後,必須等所有觀察者響應結束後才可以進行接下來的操作;非同步呼叫指被觀察者發布訊息後,即可進行接下來的操作)。

簡單來說,就是在軟體設計中維護乙個依賴列表,當任何狀態發生改變自動通知他們。借用乙個在部落格看到的例子,觀察者模式就像報紙和雜誌的訂閱:向某家報社訂閱報紙,只要報社有新的的報紙出版,就會給你送來,只要你是他們的客戶,你就會一直收到新的報紙。當你不想再看報紙的時候,可以取消訂閱,他們就不再送新的報紙過來。

只要報社還一直在運營,就會一直有人(或單位)向他們訂閱報紙或取消訂閱報紙。

對於乙個大型複雜的系統,觀察者模式可以很好的解決類間訊息交換的問題。總結來說,觀察者模式有以下優點:

觀察者模式的優點有時候也會是缺點,他可能會帶來整體系統效率的浪費,同時如果被觀察者之間有依賴關係的話,其邏輯關係的梳理需要費一些心思。

我在github上看到了乙個同學做的例子,覺得還不錯:乙個模組載入器的簡單實現

這個案例實現了乙個簡單的模組載入器,其中就用到了觀察者模式。接下來我們分析一下其中用到的觀察者模式。

對於watcher這個建構函式,task是乙個待執行的callback,uris是這個非同步callback所依賴的模組(位址),dep是乙個訂閱器。$len是依賴模組的陣列長度。如果乙個模組載入好了,那麼通知這個watcher,這個watcher的$len變數就減一。對於乙個watcher,我們不用關心當前到底是哪個模組載入好了,反正只能是所有依賴模組載入好,這個task才能被執行。所以當$len為零的時候,表面依賴全部載入好,那麼這個wathcer就執行這個task。

function watcher(task, uris, dep, module)
watcher每執行一次update,this.$len--。當為零的時候,執行this.run()方法。this.run()中,如果task是乙個函式,那麼執行執行。因為在define函式中,如果define裡面沒有依賴,就會將其callback直接放入watcher。如果有依賴,則會先建立乙個task物件,將當前define指令碼的src存入task,以便觸發該dep的notify方法。

watcher.prototype = 

},run: function () );

//this.$module.module[this.dep.depname].obj =

if (typeof task == 'function')

let src = task.currentsrc;

mod[src].dep.notify();

this.dep.removesub(this);

return

}};

dep是乙個訂閱器,用乙個訂閱器來存放乙個模組,不管define有多深,模組a依賴於模組b,模組b依賴於模組c。當模組c載入好後(約定模組c是不依賴於任何其他模組的),模組c的訂閱器dep觸發notify方法,subs裡面的watcher的update方法。

function dep(depname)

dep.prototype = task new watcher()

*/addsubs: function(task),

/*** 刪除訂閱, 將watcher從陣列subs中刪除

* @param task new watcher()

*/removesub: function(task),

/*** 當該模組載入好的時候, 通知所有依賴它的task

*/notify: function());

}};

以上就實現了乙個簡單的模組載入器。乙個物件的改變狀態,則所有依賴於它的物件都會得到通知更新。在這個例子中watcher跟dep之間是關聯關係,是抽象耦合的,它們之間形成一條觸發鏈,依次對每乙個dep中的物件進行處理。這樣就很好的解決了物件之間的通訊問題。

簡單的觀察者模式

本文 使用的語言為c 請使用別的語言的同學自行轉換為自己習慣的語言 什麼是觀察者模式?簡單來說,就是一對多的通知,舉個例子 在保衛城堡類的遊戲中,如果城堡受到了攻擊,就會通知 兵營 出兵,城牆 公升級加固等等,這時的城堡就是被觀察者,而負責做出相應反應的就是觀察者。當被觀察者狀態發生改變的時候,通知...

觀察者模式簡單總結

觀察者模式就是兩個類的使用 public inte ce observer public class observable就像我們平時寫監聽一樣,不過這次是把listener加入集合中使用。public class aa public void notifyobservers public inte...

觀察者模式的簡單demo

定義物件之間一對多的關係,當乙個物件狀態被更新時,所有依賴於它的物件都將被更新。觀察者模式有四種定義角色,分別為 抽象主題 subject 具體主題 concretesubject 抽象觀察者 observer 具體觀察者 concreteobserver 這種模式可以理解為 抽象主題中定義具體主題...