觀察者模式
觀察者模式(Observer),當(dāng)一個對象的狀態(tài)發(fā)生改變時润文,依賴他的對象會全部收到通知,并自動更新。
場景:一個事件發(fā)生后,要執(zhí)行一連串更新操作.傳統(tǒng)的編程方式,就是在事件的代碼之后直接加入處理邏輯,當(dāng)更新得邏輯增多之后,代碼會變得難以維護.這種方式是耦合的,侵入式的,增加新的邏輯需要改變事件主題的代碼。
觀察者模式實現(xiàn)了低耦合,非侵入式的通知與更新機制。
-
代碼
-
基類 EventGenerator
<?php namespace Test; /** * 事件產(chǎn)生類 * Class EventGenerator */ abstract class EventGenerator { private $ObServers = []; //增加觀察者 public function add(ObServer $ObServer) { $this->ObServers[] = $ObServer; } //事件通知 public function notify() { foreach ($this->ObServers as $ObServer) { $ObServer->update(); } } }
-
接口類 ObServer
<?php namespace Test; /** * 觀察者接口類 * Interface ObServer */ interface ObServer { public function update($event_info = null); }
-
觀察者1
<?php namespace Test; /** * 觀察者1 */ class ObServer1 implements ObServer { public function update($event_info = null) { echo "觀察者1 收到執(zhí)行通知 執(zhí)行完畢缺亮!\n"; } }
-
觀察者2
<?php namespace Test; /** * 觀察者1 */ class ObServer1 implements ObServer { public function update($event_info = null) { echo "觀察者1 收到執(zhí)行通知 執(zhí)行完畢!\n"; } }
-
事件
<?php namespace Test; /** * 事件 * Class Event */ class Event extends EventGenerator { /** * 觸發(fā)事件 */ public function trigger() { //通知觀察者 $this->notify(); } } //創(chuàng)建一個事件 $event = new Event(); //為事件增加旁觀者 $event->add(new ObServer1()); $event->add(new ObServer2()); //執(zhí)行事件 通知旁觀者 $event->trigger();
-