<?php
/**
* 观察者模式
*
* 观察者模式定义了一个一对多的依赖关系
* 让一个或多个观察者对象监察一个主题对象
* 这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象
* 使这些观察者对象能够自动更新。
*
* @author doodoo<pwtitle@gmail.com>
*/
/**
* 一个抽象的主题接口即被观察者
*/
interface Subject{
public function attach(Observer $observer);
public function detach(Observer $observer);
public function notifyObservers();
}
/**
* 具体的被观察者
* 实际接口
*/
class MySubject implements Subject {
private $observers = array();
public function attach(Observer $observer){
$this->observers[] = $observer;
}
public function detach(Observer $observer){
$key = array_search($observer,$this->observers);
if(false!=$key){
unset($this->observers[$key]);
}
}
public function notifyObservers(){
foreach ($this->observers as $observer) {
if($observer instanceof Observer){
$observer->update();
}
}
}
/**
* 取得观察者总数
*/
public function getCountObservers(){
return sizeof($this->observers);
}
}
/**
* 观察者的接口
*/
interface Observer{
public function update();
}
/**
* 具体观察者,用来获得主题的通知
*/
class MyObserver implements Observer {
private $id = null;
public function __construct(){
$this->id = uniqid();
}
public function update(){
echo "收到通知!";
echo $this->id;
echo "<BR>\r\n";
}
}
$observer1 = new MyObserver(1);
$observer2 = new MyObserver(2);
$observer3 = new MyObserver(3);
$subject = new MySubject();
$subject->attach($observer1);
$subject->attach($observer2);
$subject->attach($observer3);
echo "观察者总数:".$subject->getCountObservers()."<BR>\r\n";
$subject->notifyObservers();
echo "\r\n";
?>