觀察者模式的核心是把客戶元素(觀察者)從一個中心類(主體)中分離開來。當主體知道事件發生時,觀察者需要被通知到。同時,我們並不希望將主體與觀察者之間的關系進行硬編碼。為了達到這個目的,我們可以允許觀察者在主體上進行注冊。
觀察者模式實現了低耦合、非侵入式的通知與更新機制。
場景:當一個事件發生後,要執行一連串更新操作。
EventGenerator.php
<?php namespace Baobab; /** * Class EventGenerator 基類,事件發生者 */ abstract class EventGenerator{ //觀察者對於事件發生者是不可見的,事件發生者不關心有哪些觀察者關注了事件 private $observers = array(); /** * 添加觀察者 */ function addObserver(Observer $observer){ $this->observers[] = $observer; } /** *逐個通知觀察者進行更新的操作 */ function notify(){ foreach($this->observers as $observer){ $observer->update(); } } }
Observer.php
<?php namespace Baobab; /** * Class Observer 觀察者,觀察的對象是事件發生者 * @package Baobab */ interface Observer{ /** * @param null $event_info 事件的信息 * 表示事件發生後進行更新的操作 */ function update($event_info = null); }
index.php
class Event extends \Baobab\EventGenerator{ /** *觸發一個新的事件 */ function trigger(){ echo 'Event發生'; $this->notify(); } } /** * 觀察者1 */ class Observer1 implements \Baobab\Observer{ function Update($event_info = null){ echo '更新操作代碼1'; } }
/**
* 觀察者2
*/ class Observer2 implements \Baobab\Observer{ function Update($event_info = null){ echo '更新操作代碼2'; } } $event = new Event(); $event->addObserver(new Observer1()); $event->addObserver(new Observer2()); $event->trigger();