目录

观察者模式很好理解,类似于邮件订阅和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