觀察者模式的核心是把客戶元素(觀察者)從一個中心類(主體)中分離開來。當主體知道事件發生時,觀察者需要被通知到。同時,我們並不希望將主體與觀察者之間的關系進行硬編碼。為了達到這個目的,我們可以允許觀察者在主體上進行注冊。
觀察者模式實現了低耦合、非侵入式的通知與更新機制。
場景:當一個事件發生後,要執行一連串更新操作。
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();