您的位置:首页 > 编程语言 > PHP开发

转 php 观察者模式

2013-06-14 15:54 190 查看
<?php
/**
* 观察者模式
*/

/**
* 抽象主题角色
*/
interface Subject {

/**
* 增加一个新的观察者对象
* @param Observer $observer
*/
public function attach(Observer $observer);

/**
* 删除一个已注册过的观察者对象
* @param Observer $observer
*/
public function detach(Observer $observer);

/**
* 通知所有注册过的观察者对象
*/
public function notifyObservers();
}

/**
* 具体主题角色
*/
class ConcreteSubject implements Subject {

private $_observers;

public function __construct() {
$this->_observers = array();
}

/**
* 增加一个新的观察者对象
* @param Observer $observer
*/
public function attach(Observer $observer) {
return array_push($this->_observers, $observer);
}

/**
* 删除一个已注册过的观察者对象
* @param Observer $observer
*/
public function detach(Observer $observer) {
$index = array_search($observer, $this->_observers);
if ($index === FALSE || ! array_key_exists($index, $this->_observers)) {
return FALSE;
}

unset($this->_observers[$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 implements Observer {

/**
* 观察者的名称
* @var <type>
*/
private $_name;

public function __construct($name) {
$this->_name = $name;
}

/**
* 更新方法
*/
public function update() {
echo "Observer ". $this->_name. " has notified.\n";
}

}

$subject = new ConcreteSubject();

/* 添加第一个观察者 */
$observer1 = new ConcreteObserver('Martin');
$subject->attach($observer1);

echo "\n The First notify:\n";
$subject->notifyObservers();

/* 添加第二个观察者 */
$observer2 = new ConcreteObserver('phppan');
$subject->attach($observer2);

echo "\n The Second notify:\n";
$subject->notifyObservers();

/* 删除第一个观察者 */
$subject->detach($observer1);

echo "\n The Third notify:\n";
$subject->notifyObservers();
?>


转至:http://wend1054.blog.163.com/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: