您好,登錄后才能下訂單哦!
PHP中怎么實現觀察者模式,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
“觀察者模式”的觀察者三個字信息量很大,玩過很多網絡游戲的童鞋們應該知道,即便是斗地主,除了玩家,還有一個角色叫“觀察者",在咱們本次文章中的觀察者模式也是如此,就是我們會有要有一個“主題”,只有有了一個主題,觀察者或者說各位看官才能搬著小板凳兒聚在一堆,來看我的文章。其次,觀察者還必須要有自己的操作,也就是說,你不能光看我的文章啊,還得自己動手,否則你聚在一堆兒沒事做也沒什么意義,白看一篇文章,浪費了時間。
從面向過程的角度來看,首先是觀察者向主題注冊,注冊完之后,主題再通知觀察者做出相應的操作,整個事情就完了。
從面向對象的角度來看,主題提供注冊和通知的接口,觀察者提供自身操作的接口,(這些觀察者擁有一個同一個接口)觀察者利用主題的接口向主題注冊,而主題利用觀察者接口通知觀察者,耦合度相當之低。
可以這么來說,就是,觀察者設計模式能夠更便利創建和查看目標對象狀態的對象,并且提供和核心對象非耦合的置頂功能性。
我們可以看到,觀察者設計模式非常常用,在一般復雜的WEB系統中,觀察者模式可以幫你減輕代碼設計的壓力,降低代碼耦合。
縣來看一個完整的場景應用:
設計一個訂單類
訂單創建完成后,會做各種動作,比如發送EMAIL,或者改變訂單狀態等等。
原始的方法,是將這些操作都寫在create函數里面
但是隨著訂單創建類的越來越龐大,這樣的操作已經無法滿足需求和快速變動
這個時候,觀察者模式出現了。
來看下代碼實例:
<?php //觀察者設計模式能夠更便利創建和查看目標對象狀態的對象,并且提供和核心對象非耦合的置頂功能性。 //觀察者設計模式非常常用,在一般復雜的WEB系統中,觀察者模式可以幫你減輕代碼設計的壓力,降低代碼耦合。 //以一個購物流程為例子 class order { protected $observers = array(); // 存放觀察容器 //觀察者新增 public function addObServer($type, $observer) { $this->observers[$type][] = $observer; } //運行觀察者 public function obServer($type) { if (isset($this->observers[$type])) { foreach ($this->observers[$type] as $obser) { $a = new $obser; $a->update($this); //公用方法 } } } //下單購買流程 public function create() { echo '購買成功'; $this->obServer('buy'); // buy動作 } } class orderEmail { public static function update($order) { echo '發送購買成功一個郵件'; } } class orderStatus { public static function update($order) { echo '改變訂單狀態'; } } $ob = new order; $ob->addObServer('buy', 'orderEmail'); $ob->addObServer('buy', 'orderStatus'); $ob->create();
運行結果:
購買成功發送購買成功一個郵件改變訂單狀態
再來看個大點的實例:
<?php // 主題接口 interface Subject{ public function register(Observer $observer); public function notify(); } // 觀察者接口 interface Observer{ public function watch(); } // 主題 class Action implements Subject{ public $_observers=array(); public function register(Observer $observer){ $this->_observers[]=$observer; } public function notify(){ foreach ($this->_observers as $observer) { $observer->watch(); } } } // 觀察者 class Cat implements Observer{ public function watch(){ echo "Cat watches TV<hr/>"; } } class Dog implements Observer{ public function watch(){ echo "Dog watches TV<hr/>"; } } class People implements Observer{ public function watch(){ echo "People watches TV<hr/>"; } } // 應用實例 $action=new Action(); $action->register(new Cat()); $action->register(new People()); $action->register(new Dog()); $action->notify();
運行結果:
Cat watches TV
--------------------------------------------------------------------------------
People watches TV
--------------------------------------------------------------------------------
Dog watches TV
--------------------------------------------------------------------------------
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。