php设计模式之调查者模式
添加时间:2013-5-21 点击量:
调查者模式:定义对象间一种一对多的依附关系,当一个对象的状况产生改变时,所有依附于它的对象都获得通知并主动更新。
调查者类:
1.抽象主题角色:主题角色将所有对调查者对象的引用保存在一个凑集中,每个主题可以随便率性多个调查者。抽象主题供给了增长和删除调查者对象的接口。
2.抽象调查者角色:为所有的具体调查者定义一个接口,在调查的主题产生改变时更新本身
3.具体主题角色:存储相干状况到具体调查者对象,当具体主题的内部状况产生改变时,给所有挂号过的调查者发出通知。具体主题角色凡是用一个具体子类实现。
4.具体调查者角色:存储一个具体主题对象,存储相干状况,实现抽象调查者角色所请求的更新接口,以使得其自身状况和主题的状况对峙一致
感化:
1. 调查者模式的耦合度较小
2.支撑广播通信
<?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->();
}
return true;
}
}
//抽象调查者
interface Observer{
public function ();
}
//具体调查者
class ConcreteObserver implement Observer{
private ¥_name;
public function __construct(¥name){
¥this->_name = ¥name;
}
public function (){
echo Observer,¥this->_name.has notified<br/>;
}
}
//客户端
class Client{
public static function main(){
¥subject = new ConcreteSubject();
//新增第一个调查者
¥observer1 = new ConcreteObserver(Martin);
¥subject->attach(¥observer1);
//通知
¥subject->notifyObservers();
//新增第二个调查者
¥observer2 = new ConcreteObserver(jaky);
¥subject->attach(¥observer2);
//通知
¥subject->notifyObservers();
//删除调查者1
¥subject->deatch(¥observer1);
//通知
¥subject->notifyObservers();
}
}
Client::main();
?>
所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》
调查者模式:定义对象间一种一对多的依附关系,当一个对象的状况产生改变时,所有依附于它的对象都获得通知并主动更新。
所有随风而逝的都属于昨天的,所有历经风雨留下来的才是面向未来的。—— 玛格丽特·米切尔 《飘》
调查者类:
1.抽象主题角色:主题角色将所有对调查者对象的引用保存在一个凑集中,每个主题可以随便率性多个调查者。抽象主题供给了增长和删除调查者对象的接口。
2.抽象调查者角色:为所有的具体调查者定义一个接口,在调查的主题产生改变时更新本身
3.具体主题角色:存储相干状况到具体调查者对象,当具体主题的内部状况产生改变时,给所有挂号过的调查者发出通知。具体主题角色凡是用一个具体子类实现。
4.具体调查者角色:存储一个具体主题对象,存储相干状况,实现抽象调查者角色所请求的更新接口,以使得其自身状况和主题的状况对峙一致
感化:
1. 调查者模式的耦合度较小
2.支撑广播通信
<?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->();
}
return true;
}
}
//抽象调查者
interface Observer{
public function ();
}
//具体调查者
class ConcreteObserver implement Observer{
private ¥_name;
public function __construct(¥name){
¥this->_name = ¥name;
}
public function (){
echo Observer,¥this->_name.has notified<br/>;
}
}
//客户端
class Client{
public static function main(){
¥subject = new ConcreteSubject();
//新增第一个调查者
¥observer1 = new ConcreteObserver(Martin);
¥subject->attach(¥observer1);
//通知
¥subject->notifyObservers();
//新增第二个调查者
¥observer2 = new ConcreteObserver(jaky);
¥subject->attach(¥observer2);
//通知
¥subject->notifyObservers();
//删除调查者1
¥subject->deatch(¥observer1);
//通知
¥subject->notifyObservers();
}
}
Client::main();
?>