您好,登錄后才能下訂單哦!
首先來看個栗子:
//事件 class EventDemo { //觸發了新事件 public function trigger() { echo "Event happening\r"; echo "后續業務更新邏輯1\r\n"; echo "后續業務更新邏輯2\r\n"; echo "后續業務更新邏輯3\r\n"; } }
場景:當事件發生變化時,觸發其他業務進行相關的操作
特征1.所有業務代碼都是***式的,直接放置于核心業務當中。
2.耦合度太高,不便于管理維護。需要一件一件事去做處理。
于是我們可以這樣假設:
假如后續業務都是都是該事件的關注者,當事件發生改變,只需要通知到觀察者即可。其他的工作由觀察者自行完成。
類似發布--訂閱這種模式。
代碼實現:
步驟1.定義觀察者接口
步驟2.定義觀察者類
步驟3.定義事件產生器(抽象類)
步驟4.定義事件場景類(繼承并實現事件產生器抽象類)
步驟5.實例化運用
實例化事件場景-->添加觀察者-->通知
定義觀察者接口
/** * 定義觀察者接口(觀察對象為事件發生者) *Interface Observer */ interface Observer { /** * 事件發生時,進行更新操作 * @param null $eventInfo 發生事件的信息 * @return mixed */ public function update($eventInfo = null); }
定義觀察者類
//定義多個觀察者 class Observer1 implements Observer { public function update($eventInfo = null) { echo "觀察者1:準備開始{$eventInfo}<br> \r\n"; } } class Observer2 implements Observer { public function update($eventInfo = null) { echo "觀察者2:準備開始{$eventInfo}<br> \r\n"; } }
定義事件產生器(抽象類)
/** * 事件產生者(抽象類) * Class EventGenerator */ abstract class EventGenerator { private $observers = [];//事件的所有觀察者 /** * 增加觀察者 * @return mixed */ public function addObserver(Observer $observer) { $this->observers[] = $observer; } /** * 通知事件發生了,其他觀察者接到通知后更新業務邏輯 * @return mixed */ public function notify($eventInfo) { foreach ($this->observers as $observer) { $observer->update($eventInfo); } } }
定義事件場景類(繼承并實現事件產生器抽象類)
/** * 定義事件類(繼承事件產生者類) * Class Event */ class Event extends EventGenerator { public function trigger($eventInfo) { echo "事件 :{$eventInfo} 即將發生,通知觀察者們做好更新準備<br>\r\n"; $this->notify($eventInfo); echo "<br/>"; } }
主業務場景的實現
$event = new Event(); //此處可以動態添加、刪除觀察者 $event->addObserver(new Observer1()); //$event->addObserver(new Observer2()); //此處可以發生任意多個事件 $event->trigger('吃飯'); $event->trigger('喝水'); $event->trigger('走路');
至此,我們可以看到在主業務場景中,只需要簡單的管理(添加、刪除)觀察者,管理(添加、刪除)發生事件就可以實現簡化代碼邏輯,減少耦合完成任務。更好的好處是,業務代碼解耦合,便于后期的維護擴展。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。