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

定义

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

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

场景

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

业务我们知道了,被观察者韩非子吃饭、玩游戏等等一系列活动,都要被告知李斯大人。禅里用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.
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 法之魂 韩非未死,那杯酒里,没有毒。 可是,醒来的韩非,仿佛看透了生死,他只说了一句话:“笔,纸。”既然死不了,或...
    风致自己阅读 1,188评论 0 3
  • 一不留神地,初中毕业都10年了,真快呀……若不是罗婷一大早的信息截图,是否我将淡忘师恩? 那是在初一吧,班上教了一...
    花的骄傲阅读 334评论 0 0
  • 看完大叔的那篇文章,内心还是有很多共鸣的,尤其是评论里的一句话更加加深了认同感. 【其实不纠结加班不加班这一点,看...
    蕾o_O阅读 269评论 0 0
  • d> 我正式进入 习惯养成的疲惫区,我鼓励自己坚持一下,坚持写日新点滴,很快就会有迎来收获期。每天五点起床的习惯也...
    复苏森林阅读 57评论 0 1