一、意图

定义工具间的一种一对多的依赖关系,当一个工具的状态发生改变时,所有依赖于它的工具都得到关照并被自动更新【GOF95】

又称为发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听(Source-Listener)模式、或从属者(Dependents)模式

php观察者模式php不雅察者模式详解 Node.js

二、不雅观察者模式构造图

三、不雅观察者模式中紧张角色抽象主题(Subject)角色:主题角色将所有对不雅观察者工具的引用保存在一个凑集中,每个主题可以有任意多个不雅观察者。
抽象主题供应了增加和删除不雅观察者工具的接口。

抽象不雅观察者(Observer)角色:为所有的详细不雅观察者定义一个接口,在不雅观察的主题发生改变时更新自己。

详细主题(ConcreteSubject)角色:存储干系状态到详细不雅观察者工具,当详细主题的内部状态改变时,给所有登记过的不雅观察者发出关照。
详细主题角色常日用一个详细子类实现。

详细不雅观察者(ConcretedObserver)角色:存储一个详细主题工具,存储干系状态,实现抽象不雅观察者角色所哀求的更新接口,以使得其自身状态和主题的状态保持同等。

四、不雅观察者模式的优点和缺陷

不雅观察者模式的优点:1、不雅观察者和主题之间的耦合度较小;

2、支持广播通信;

不雅观察者模式的缺陷:1、由于不雅观察者并不知道其它不雅观察者的存在,它可能对改变目标的终极代价一无所知。
这可能会引起意外的更新。

五、不雅观察者模式适用场景1、当一个抽象模型有两个方面,个中一个方面依赖于另一个方面。

2、当对一个工具的改变须要同时改变其它工具,而不知道详细有多少个工具待改变。

3、当一个工具必须关照其它工具,而它又不能假定其它工具是谁。
换句话说,你不肯望这些工具是紧密耦合的。

六、不雅观察者模式与其它模式中介者模式(Mediator):通过封装繁芜的更新语义,ChangeManager充当目标和不雅观察者之间的中介者。

单例模式(singleton模式):ChangeManager可利用Singleton模式来担保它是唯一的并且是可全局访问的。

七、不雅观察者模式PHP示例

<?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实现星号隐蔽用户名,手机和邮箱的方法

php微信"大众平台配置接口开拓程序的方法实例详解

PHP实现上一篇下一篇的方法详解

以上便是php不雅观察者模式详解的详细内容,更多请关注其它干系文章!

更多技巧请《转发 + 关注》哦!