一、意图
定义工具间的一种一对多的依赖关系,当一个工具的状态发生改变时,所有依赖于它的工具都得到关照并被自动更新【GOF95】
又称为发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听(Source-Listener)模式、或从属者(Dependents)模式
二、不雅观察者模式构造图
三、不雅观察者模式中紧张角色抽象主题(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不雅观察者模式详解的详细内容,更多请关注其它干系文章!
更多技巧请《转发 + 关注》哦!