23-观察者模式
目录
观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。
其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。
代码示例
<?php
/**
* Description of ObserverDemo
* 观察者模式
* @author jm
*/
class ObserverDemo
{
//put your code here
public static function main()
{
$ms = new MySubjecter();
$ms->addObserver(new Observer2());
$ms->addObserver(new Observer1());
$ms->doSomething();
}
}
//定义观察者
interface IObserver{
public function update();
}
class Observer1 implements IObserver{
public function update()
{
echo "观察者1 完成观察操作\n";
}
}
class Observer2 implements IObserver{
public function update()
{
echo "观察者2 完成观察操作\n";
}
}
//定义事件触发者
interface Subjecter{
public function addObserver($observer);
public function delObserver($observer);
public function notifyObserver();
public function doSomething();
}
//这里业务类 可以再抽象一次吧添加、删除、通知观察者的逻辑抽象,把doSomething留给具体业务逻辑类
class MySubjecter implements Subjecter{
private $_observers = [];
public function addObserver($observer){
$this->_observers[] = $observer;
}
public function delObserver($observer){
foreach ($this->_observers as $key => $value) {
if ($observer === $value) {
unset($this->_observers[$key]);
}
}
}
public function notifyObserver(){
foreach ($this->_observers as $observer) {
$observer->update();
}
}
public function doSomething(){
echo "业务逻辑处理...结束,接下去通知后续任务执行:\n";
$this->notifyObserver();
}
}
ObserverDemo::main();
输出
业务逻辑处理...结束,接下去通知后续任务执行:
观察者2 完成观察操作
观察者1 完成观察操作
小结
观察者模式,定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。
观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。
本文部分收藏来自互联网,仅用于学习研究,著作权归原作者所有,如有侵权请联系删除
markdown 9ong@TsingChan