学习php设计模式 php实现观察者模式(Observer)_php技巧
一、意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新【GOF95】 又称为发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听(Source-Listener)模式、或从属者(Dependents)模式 二、观察者模式结构图
三、观察者模式中主要角色 <?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.<br />'; } } /** * 客户端 */class Client { /** * Main program. */ public static function main() { $subject = new ConcreteSubject(); /* 添加第一个观察者 */ $observer1 = new ConcreteObserver('Martin'); $subject->attach($observer1); echo '<br /> The First notify:<br />'; $subject->notifyObservers(); /* 添加第二个观察者 */ $observer2 = new ConcreteObserver('phppan'); $subject->attach($observer2); echo '<br /> The Second notify:<br />'; $subject->notifyObservers(); /* 删除第一个观察者 */ $subject->detach($observer1); echo '<br /> The Third notify:<br />'; $subject->notifyObservers(); } } Client::main();?> 以上就是使用php实现观察者模式的代码,还有一些关于观察者模式的概念区分,希望对大家的学习有所帮助。 |