观察者模式定义对象间一种一对多的依赖关系当一个对象的状态发生改变时所有依赖于它的对象都得到通知并自动更新
观察者类
抽象主题角色主题角色将所有对观察者对象的引用保存在一个集合中每个主题可以任意多个观察者抽象主题提供了增加和删除观察者对象的接口
抽象观察者角色为所有的具体观察者定义一个接口在观察的主题发生改变时更新自己
具体主题角色存储相关状态到具体观察者对象当具体主题的内部状态发生改变时给所有登记过的观察者发出通知具体主题角色通常用一个具体子类实现
具体观察者角色存储一个具体主题对象存储相关状态实现抽象观察者角色所要求的更新接口以使得其自身状态和主题的状态保持一致
作用
观察者模式的耦合度较小
支持广播通信
代码如下:
<?php
//抽象主题
interface Subject{
public function attach($observer);
public function detach($observer);
public function notifyObservers();
}
//具体主题
class ConcreateSubject implements Subject{
private $_observers;
public function __construct(){
$this
>_observers = array();
}
public function attach($observer){
return array_push($this
>_observers
$observer);
}
public function detach($observer){
$index = array_search($observer
$this
>_observers);
if($index === false || !array_key_exists($index
$this
>_observers)){
return false;
}
unset($this
>_observer[$index]);
return true;
}
public function notifyObservers(){
if(!is_array($this
>_observers)){
return false;
}
foreach($this
>_observers as $observer){
$observer
>update();
}
return true;
}
}
//抽象观察者
interface Observer{
public function update();
}
//具体观察者
class ConcreteObserver implement Observer{
private $_name;
public function __construct($name){
$this
>_name = $name;
}
public function update(){
echo
Observer
$this
>_name
has notified<br/>
;
}
}
//客户端
class Client{
public static function main(){
$subject = new ConcreteSubject();
//新增第一个观察者
$observer
= new ConcreteObserver(
Martin
);
$subject
>attach($observer
);
//通知
$subject
>notifyObservers();
//新增第二个观察者
$observer
= new ConcreteObserver(
jaky
);
$subject
>attach($observer
);
//通知
$subject
>notifyObservers();
//删除观察者
$subject
>deatch($observer
);
//通知
$subject
>notifyObservers();
}
}
Client::main();
?>