一、什麼是觀察者模式
被觀察者發生改變時,通知觀察者。
**實現:見我的github:觀察者模式學習筆記
二、存在場景
atm:你到atm 機器上取錢,多次輸錯密碼,卡就會被atm吞掉,吞卡動作發生的時候,會觸發哪些事件呢?第一攝像頭連續快拍,第二,通知監控系統,吞卡發生;第三,初始化atm 機螢幕,返回最初狀態。你不能因為就吞了一張卡,整個atm 都不能用了吧,一般前兩個動作都是通過觀察者模式來完成的。
廣播鏈的問題:如果你做過資料庫的觸發器,你就應該知道有乙個觸發器鏈的問題,比如表a 上寫了乙個觸發器,內容是乙個字段更新後更新表b 的一條資料,而表b 上也有個觸發器,要更新表c,表c 也有觸發器…,完蛋了,這個資料庫基本上就毀掉了!我們的觀察者模式也是一樣的問題,乙個觀察者可以有雙重身份,即使觀察者,也是被觀察者,這沒什麼問題呀,但是鏈一旦建立,這個邏輯就比較複雜,可維護性非常差,根據經驗建議,在乙個觀察者模式中最多出現乙個物件既是觀察者也是被觀察者,也就是說訊息最多**一次(傳遞兩次),這還是比較好控制的。
非同步處理問題:這個ejb 是乙個非常好的例子,被觀察者發生動作了,觀察者要做出回應,如果觀察者比較多,而且處理時間比較長怎麼辦?那就用非同步唄,非同步處理就要考慮執行緒安全和佇列的問題,這個大家有時間看看message queue,就會有更深的了解。
三、設計思路
主要主體:觀察者和被觀察者
觀察者:第一步:修改flag/change:表示被觀察者發生變化:super.setchanged();
第二步:通知其他觀察者已經發生變化:
(1)傳入變化資訊:引數;super.notifyobservers("animalobservable eat");
(2)建立本地觀察者的快照;object arrlocal;
(3)加鎖;synchronized (this)
(4)狀態判斷,並執行操作;for (int i = arrlocal.length-1; i>=0; i--) ((observer)arrlocal[i]).update(this, arg);
被觀察者:update方法執行被通知後操作
依賴注入
message queue
觀察者模式 Observer
個人理解 觀察者模式的核心是subject的attach和detach方法,載入observer物件 uml類圖 實現 public abstract class subject public void detach observer observer public void notify publ...
觀察者模式 ObServer
觀察者模式 observer 定義物件間的一種一對多的依賴關係,當乙個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新 觀察者模式 observer 觀察者模式定義了一對多依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。讓主題物件在狀態發生變化時,會通知所有觀察者物件,讓他們能夠自動...
觀察者模式(OBSERVER)
觀察者模式是我選擇將其列出來的第乙個模式。看了這個模式的概念之後,有種豁然開朗的感覺。工作也由實踐上公升到了理論。平時使用的各種 net 控制項都使用了這種模式,將這種模式應用到組成乙個系統的各個元件中去,怎乙個 妙 字了得。理解了它之後,不竟又對 net 的框架敬佩有佳。不知道這其中隱藏了多少未知...