设计模式之我见二观察者模式

2017-12-24  本文已影响0人  余头

定义

程序设计过程中出现一种一对多的依赖,当一个对象的状态发生改变,所有依赖它的对象都得到通知并被自动更新,观察者模式就派上用场了。

禅里引用了一个战国时期秦国李斯监视韩国韩非子的例子来形象的解释观察者模式

场景

李斯成为最强诸侯国秦国的上尉后致力统一全国于是安插了间谍到各个国家的重要人物身边,以获取重要的信息,韩非子作为韩国重臣,身边自然少不了间谍,韩非子的任何举动李斯都要了如指掌。

业务我们知道了,被观察者韩非子吃饭、玩游戏等等一系列活动,都要被告知李斯大人。禅里用java实现的 我用php来改造下

在未引入观察者的情况下李斯大人是如何获取信息呢?

很简单

1.首先我们定义两个接口

//被观察者韩非子
interface IHanfeizi
{
    /**
     * 该吃饭了
     */
    public function haveRice();

    /**
     * 玩会游戏
     */
    public function haveFun();
}
//抽象观察者李斯
interface Ilisi
{
    /**
     * 发现状况,搞起来
     */
    public function update();
}

2.实现他们让他们活起来

class Hanfei implements IHanfeizi
{
    public function haveFun()
    {
        // TODO: Implement haveFun() method.
        echo "韩非子:玩会游戏<br/>";
        //通知李斯大人
        $lisi = new Lisi();
        $lisi->update('韩非子在吃饭');
    }

    public function haveRice()
    {
        // TODO: Implement haveRice() method.
        echo "韩非子:开始吃饭咯<br/>";
        //通知李斯大人
        $lisi = new Lisi();
        $lisi->update('韩非子在玩游戏');
    }
}
class Lisi implements Ilisi
{
    public function update($args)
    {
        // TODO: Implement update() method.
        //发现韩非子的活动了,立马向秦王老板汇报
        echo "报告老板,韩非子在搞事情----".$args.'</br>';
        echo "汇报完毕。</br>";
    }
}
$hanfei = new \Common\Example\Hanfei();
//韩非子开始吃饭了
$hanfei->haveRice();
//韩非子开始玩游戏
$hanfei->haveFun();

3.运行结果如下

韩非子:玩会游戏
报告老板,韩非子在搞事情----韩非子在玩游戏
汇报完毕。
韩非子:开始吃饭咯
报告老板,韩非子在搞事情----韩非子在吃饭
汇报完毕。

这时候韩非子的一切行为都在李斯大人的监控之下了,大功告成?再思考一下,总感觉怪怪的,对于韩非子这样的大人物,不单单只有秦国一家对其关怀备至,要是其它国家也想得知韩非子的一举一动该如何解决?显然上述例子无法做到,那么我们加入观察者试试吧


图片.png

改变一下引入观察者

interface IObserver
{
    /**
     * 发现状况,搞起来
     */
    public function update($args=null);
}
abstract class AObservable
{
    private $_observers=[];

    /**
     * 添加观察者
     * @param IObserver $observer
     */
    public function addObserver(IObserver $observer)
    {
        $this->_observers[] = $observer;
    }

    /**
     * 依次通知观察者
     */
    public function notifyObserver()
    {
        foreach ($this->_observers as $observer)
        {
            $observer->update();
        }
    }
}

这时候不管李斯马斯还是其他什么人我们再去通知不同的观察者直接创建新的观察者去实现观察者接口,接着如何操作就很随意咯

class ObserverLisi implements IObserver
{
    public function update($args = null)
    {
        // TODO: Implement update() method.
    }
}
class ObserverMasi implements IObserver
{
    public function update($args = null)
    {
        // TODO: Implement update() method.
    }
}
上一篇下一篇

猜你喜欢

热点阅读