觀察者模式(observer pattern): 定義對象間的一種一對多(或一對一)的依賴關係,當被觀察者狀態發生改變時,註冊的觀察者都會被通知。
觀察者模式又稱 發佈-訂閱(publish/subscribe)模式、模型-視圖(Model/View)模式、源-監聽器(Source/Listener)模式或從屬者(Dependents)模式this
創建一種對象和對象之間的依賴關係,一個對象發生改變時將自動通知其餘對象,其餘對象收到通知各自處理本身的業務邏輯。這裏發生改變的對象稱爲被觀察者,被通知的對象稱爲觀察者。這些觀察者之間沒有關係,能夠根據業務需求添加或刪除觀察者,便於系統維護和擴展。spa
UML 圖code
代碼實現的場景: 假設有個一個商人賣東西,他的用戶有窮人和富人兩類,商人的商品可能會漲價也可能會降價 價格波動對窮人和富人的購買行爲有不一樣的影響。
分析: 這裏的觀者目標是 商品價格 ,被觀察者是窮人和富人,商品價格變化將會通知窮人和富人,窮人富人對購買作出不一樣的反映。server
// 目標 interface Observables { public function attach(Observer $ob); public function detach(Observer $ob); public function notify(); } // 具體目標 class Saler implements Observables { protected $obs = []; protected $range = 0; public function attach(Observer $ob) { $this->obs[] = $ob; } public function detach(Observer $ob) { foreach ($this->obs as $k=>$v){ if($v != $ob){ $this->obs[] = $v; } } } public function notify() { // $this->range 爲0表示價格不變 大於0漲價 小於0降價 if($this->range != 0){ foreach ($this->obs as $ob) { $ob->update($this); } } } public function increPrice($range) { $this->range = $range; } public function getRange() { return $this->range; } } // 觀察者 interface Observer { public function update(Observables $obv); } //具體觀察者(窮人) class PoorBuyer implements Observer{ public function update(Observables $obv) { if($obv->getRange()>0){ echo '窮人:漲價不買了</br>'; }else{ echo '窮人:降價了趕忙買</br>'; } } } //具體觀察者(富人) class RichBuyer implements Observer{ public function update(Observables $obv) { echo '富人:價格波動不要緊,繼續購買<br>'; } }