<?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";
?>