這個設計模式很常用、重要, 所以要好好看。這是乙個非常經典的設計模式, 解決了不少問題, 在實際專案中應用比較廣泛。
先簡單說一下設計模式的定義: 一旦主體物件狀態發生改變,與之關聯的觀察者物件會收到通知,並進行相應操作。觀察者模式實現了低耦合,非侵入式的通知與更新機制。
舉個?, 大家都知道, 今年的豬肉**讓人有望而卻步, 讓原本就不富裕的家庭更是雪上加霜, 我有個想法就是, 讓這個超市豬肉**一降價就通知我, 好讓我能及時以較低**購買。 我這個時候我就需要觀察者, 來觀察豬肉的**, 然後及時通知我。
<?php
/** * created by 憧憬.
*//**
* 觀察者約束
* inte***ce observer
*/inte***ce observer
/** * 被觀察者 到時候也好通知觀察者
* inte***ce observable
*/inte***ce observable
/////**
// * 豬肉
// * class pork
// */
//class pork implements observable
//// public function deleteobserver(observer $observer)
//
// }
// }
//// public function notifyobserver()
//
// }
//// /**
// * 設定豬肉**
// * @param $price
// * @author: 憧憬
// */
// public function setprice($price)
//
////}
///**
* 博主自己
* class aoppp
*/class aoppp implements observer
}/**
* 李四也想吃豬肉
* class lisi
*/class lisi implements observer
}//$pork = new pork();
////$pork->addobserver(new aoppp());
//$pork->addobserver(new lisi());
//$pork->setprice(100);
/** * 這個時候你發現 可以隨便通知任何人, 也可以移除觀察者 但是每個想觀察的物件都要寫這個函式 有點重複
* 我們可以抽離出來
*/class observerutil implements observable
public function deleteobserver(observer $observer)}}
public function notifyobserver()
}}/**
* 將豬肉類改為繼承
* class pork
*/class pork extends observerutil
}$pork = new pork();
$pork->addobserver(new aoppp());
$pork->addobserver(new lisi());
$pork->setprice(100);
// 這樣的話 你要監聽雞肉 還是什麼亂七八糟的 都要方便很多了
觀察者模式在實際專案的應用中非常常見,比如你到atm
機器上取錢,多次輸錯密碼,卡就會被atm
吞掉,吞卡動作發生的時候,會觸發哪些事件呢?第一攝像頭連續快拍,第二,通知監控系統,吞卡發生; 第三,初始化atm
機螢幕,返回最初狀態,你不能因為就吞了一張卡,整個atm
都不能用了吧,一般前兩 個動作都是通過觀察者模式來完成的。
這個設計模式之後變種了乙個發布/訂閱
的模式, 這個設計模式也是比較容易理解, 大家可以去了解下。
那觀察者模式在什麼情況下使用呢?觀察者可以實現訊息的廣播,乙個訊息可以觸發多個事件,這是 觀察者模式非常重要的功能。使用觀察者模式也有兩個重點問題要解決:
如果你做過資料庫的觸發器,你就應該知道有乙個觸發器鏈的問題,比如表 a 上寫了 乙個觸發器,內容是乙個字段更新後更新表 b 的一條資料,而表 b 上也有個觸發器,要更新表 c,表 c 也有觸發器...,完蛋了,這個資料庫基本上就毀掉了!我們的觀察者模式也是一樣的問題,乙個觀察者可以有雙 重身份,即使觀察者,也是被觀察者,這沒什麼問題呀,但是鏈一旦建立,這個邏輯就比較複雜,可維護性非常差,根據經驗建議,在乙個觀察者模式中最多出現乙個物件既是觀察者也是被觀察者,也就是說消 息最多**一次(傳遞兩次),這還是比較好控制的;
被觀察者發生動作了,觀察者要做出回應,如果觀察者比較多,而且處理時間比較長怎麼辦?那就用非同步唄,非同步處理就要考慮執行緒安全和佇列的問題,這個 大家有時間看看 message queue,就會有更深的了解。
python 設計模式 觀察者 觀察者設計模式
在觀察者設計模式這種模式中,物件被表示為等待事件觸發的觀察者。一旦發生指定的事件,觀察者就會關注該主體。當事件發生時,主體告訴觀察者它已經發生。以下uml圖表示觀察者模式 如何實現觀察者模式?現在讓我們來看看如何實現觀察者模式。參考以下實現 import threading import time ...
設計模式 觀察者模式
觀察者模式定義了物件間一對多的依賴關係,乙個物件發生變化時,所有依賴它的物件都得到通知並被自動更新。本文主要闡述觀察者模式在分布式scada人機介面中的使用,利用這種模式使得人機介面顯示效率更高。發布者 郵局 觀察者 參與者 讀者 訂閱者 當郵局收到報社新雜誌的時候,即郵局狀態發生了改變,於是郵局把...
設計模式 觀察者模式
核心思想 註冊 通知 撤銷註冊 observer 將自己註冊到被觀察物件 subject 中,被觀察物件將觀察者存放在乙個容器 container 裡。被觀察物件發生了某種變化 如圖中的somechange 從容器中得到所有註冊過的觀察者,將變化通知觀察者。觀察者告訴被觀察者要撤銷觀察,被觀察者從容...