美文网首页
设计模式之我见二观察者模式

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

作者: 余头 | 来源:发表于2017-12-24 02:07 被阅读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.
    }
}

相关文章

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

    定义 程序设计过程中出现一种一对多的依赖,当一个对象的状态发生改变,所有依赖它的对象都得到通知并被自动更新,观察者...

  • 设计模式之观察者模式

    设计模式之观察者模式 本篇是设计模式系列博客的第四篇,本篇主要学习设计模式中的第二个行为型模式---观察者模式。 ...

  • 观察者设计模式

    每周学点Java设计模式__观察者设计模式 本次继续更新java23中设计模式之一——观察者模式。 观察者模式(有...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 设计模式02-观察者者设计模式

    [toc] 设计模式02-观察者者设计模式 主要来源Head First设计模式(书)观察者设计模式是JDK中使用...

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava设计模式与原理

    标准观察者设计模式 RxJava是一种特殊的观察者模式,首先我们先来看标准的观察者设计模式。在标准观察者模式中,存...

  • 设计模式

    常用的设计模式有,单例设计模式、观察者设计模式、工厂设计模式、装饰设计模式、代理设计模式,模板设计模式等等。 单例...

  • Guava源码分析——EventBus

    EventBus的设计理念是基于观察者模式的,可以参考设计模式(1)—观察者模式先来了解该设计模式。 1、程序示例...

  • PHP设计模式之观察者模式

    PHP设计模式之观察者模式

网友评论

      本文标题:设计模式之我见二观察者模式

      本文链接:https://www.haomeiwen.com/subject/avjcgxtx.html