牛逼plus!原来观察者模式竟然是这样用的

Posted autofelix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛逼plus!原来观察者模式竟然是这样用的相关的知识,希望对你有一定的参考价值。

〝 古人学问遗无力,少壮功夫老始成 〞

观察者模式是编程设计程序中占比很重要的一种设计模式,他在生活中应用非常的广泛,但是很多初学编程的小伙伴,对如何使用它却知道的甚少,其实观察者模式简单来说,就是用来监控用户的某些操作,然后根据用户这些操作来处理一些后续的事情,也许这样说比较生硬,举个例子,比如一个用户去网上下单买电影票,付款成功后,系统需要发短信给用户,顺便记录用户购票的日志等其他一些逻辑操作,这种情况中,观察者模式其实就是监控用户买票的行为,然后系统需要针对这种情况处理的一些后续行为,这种行为就很像事后诸葛亮。

目录

 一、定义观察者接口

二、定义可被观察者的接口

三、监听用户购票事件

四、罗列出购票成功后系统的任务

五、注册观察者事件

六、纵观全局


 一、定义观察者接口

  • InterfaceObserver 这个接口是系统自带的观察者接口
  • InterfaceObserver 默认需要实现onListengetObserverName这两个方法,因为是系统默认的,所以可以不定义这两个方法,但是子类必须要实现这两个方法
  • 如果是自定义观察者接口名,一定要实现onListen同功能的方法
<?php
/**
 * Interface InterfaceObserver
 * 观察者接口
 */
interface InterfaceObserver
{
    public function onListen($sender, $args);

    public function getObserverName();
}

二、定义可被观察者的接口

  • 其实就是用来监听事件的发生
  • InterfaceObservable 注意看,这个名字跟上面的观察者接口很像,但是其实是不一样的,别被名字弄晕了
  • InterfaceObservable 需要实现两个方法,跟上面的观察者接口一样,也是系统默认的,所以也不可以不写出来,这里我写出来仅仅是为了让大家等会更好的理解什么是观察者模式
<?php
/**
 * Interface InterfaceObservable
 */
interface InterfaceObservable
{
    public function addObserver($observer);
    public function removeObserver($observer_name);
}

三、监听用户购票事件

  • 既然我们要观察事件的发生,那么肯定要实现InterfaceObservable接口
  • addObserver 方法我们是用来依赖注入一些用户购票之后系统的操作
  • removeObserver 方法,大家猜都猜的出来,是用来移除某个后续操作的,所以我们暂时不去实现
  • buy 这个购票方法中,关于用户购票成功之前的逻辑不去实现,观察者模式关注的是用户购票成功后的操作
<?php
class Ticket implements InterfaceObservable
{
    /**
     * @var array
     */
    private $_observers = [];


    /**
     * @param $observer
     */
    public function addObserver($observer)
    {
        if ($observer instanceof InterfaceObserver) {
            $this->_observers[] = $observer;
        }
    }

    /**
     * @param $observer_name
     */
    public function removeObserver($observer_name)
    {
    }

    /**
     * 用户购票行为
     */
    public function buy()
    {
        //用户购票逻辑,这里不详细说明,仅仅以参数代之
        $result = [
            'code' => 200,
            'msg' => '用户购票成功',
            'sign' => 'autofelix_20210421'
        ];

        //侦查成功,开始诸葛亮操作
        if($result['code'] == 200) {
            foreach ($this->_observers as $observer) {
                $observer->onListen($this, $result['sign']);
            }
        }
    }
}

四、罗列出购票成功后系统的任务

  • 既然是系统后续的处理方式,那么肯定要实现InterfaceObserver接口
  • Listen 这个方法可以解释成,监听到了某件事的发生,而接下来需要怎么去做
<?php
/**
 * 记录用户购票日志
 * Class TicketRecord
 */
class ticketRecord implements InterfaceObserver
{
    public function onListen($sender, $args)
    {
        echo "记录用户购票成功,编号为:{$args}<br/>";
    }

    public function getObserverName()
    {
    }
}

/**
 * 给用户发送观影短信
 * Class sendMsg
 */
class sendMsg implements InterfaceObserver
{
    public function onListen($sender, $args)
    {
        echo "您的电影票购买成功,请凭编号:{$args}观影<br/>";
    }

    public function getObserverName()
    {
    }
}

五、注册观察者事件

<?php
$ticket = new Ticket();
$ticket->addObserver(new ticketRecord());
$ticket->addObserver(new sendMsg());
$ticket->buy();

//运行结果:
//记录用户购票成功,编号为:autofelix_20210421
//您的电影票购买成功,请凭编号:autofelix_20210421观影

六、纵观全局

  • 在这个案例中,其实观察者模式就做了一件事,观察到用户购票成功事件之后,然后针对这种事情,接下来系统需要做哪些事情
  • 通过这个案例,是不是很容易理解了什么是观察者模式,以及它在现实中的应用
<?php
/**
 * Created by PhpStorm.
 * User: autofelix
 * Date: 1/23/21
 * Time: 7:20 PM
 * Desc: 观察者模式购票
 */

/**
 * Interface InterfaceObserver
 * 观察者接口
 */
interface InterfaceObserver
{
    public function onListen($sender, $args);

    public function getObserverName();
}

/**
 * Interface InterfaceObservable
 * 被观察对象接口
 */
interface InterfaceObservable
{
    public function addObserver($observer);

    public function removeObserver($observer_name);
}

class Ticket implements InterfaceObservable
{
    /**
     * @var array
     */
    private $_observers = [];


    /**
     * @param $observer
     */
    public function addObserver($observer)
    {
        if ($observer instanceof InterfaceObserver) {
            $this->_observers[] = $observer;
        }
    }

    /**
     * @param $observer_name
     */
    public function removeObserver($observer_name)
    {
    }

    /**
     * 用户购票行为
     */
    public function buy()
    {
        //用户购票逻辑,这里不详细说明,仅仅以参数代之
        $result = [
            'code' => 200,
            'msg' => '用户购票成功',
            'sign' => 'autofelix_20210421'
        ];

        //购票成功,开始后期处理
        if($result['code'] == 200) {
            foreach ($this->_observers as $observer) {
                $observer->onListen($this, $result['sign']);
            }
        }
    }
}


/**
 * 记录用户购票日志
 * Class TicketRecord
 */
class ticketRecord implements InterfaceObserver
{
    public function onListen($sender, $args)
    {
        echo "记录用户购票成功,编号为:{$args}<br/>";
    }

    public function getObserverName()
    {
    }
}

/**
 * 给用户发送观影短信
 * Class sendMsg
 */
class sendMsg implements InterfaceObserver
{
    public function onListen($sender, $args)
    {
        echo "您的电影票购买成功,请凭编号:{$args}观影<br/>";
    }

    public function getObserverName()
    {
    }
}

$ticket = new Ticket();
$ticket->addObserver(new ticketRecord());
$ticket->addObserver(new sendMsg());
$ticket->buy();

 猜你喜欢:

牛逼plus!原来观察者模式竟然是这样用的

牛逼plus!原来策略模式竟然是这样用的

牛逼plus!原来适配器模式竟然是这样用的

牛逼plus!原来工厂模式竟然是这样用的

牛逼plus!原来单例模式竟然是这样用的

以上是关于牛逼plus!原来观察者模式竟然是这样用的的主要内容,如果未能解决你的问题,请参考以下文章

牛逼plus!原来策略模式竟然是这样用的

牛逼plus!原来工厂模式竟然是这样用的

牛逼plus!原来单例模式竟然是这样用的

爬虫技术原来可以做这么多牛逼哄哄的事情!

面向对象编程思想--单例模式

扒去Spring事件监听机制的外衣,竟然是观察者模式