设计模式PHP版四 - 观察者模式

意图:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

主要解决:
一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

何时使用:
一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

个人理解:
就像订阅公众号一样,公众号发布一条推送,所有订阅者就都能接收到。

<?php
/**
 * 事件产生类
 *
 * Class EventGenerator
 */
abstract class EventGenerator
{
    private $ObServers = []; // 初始化一个数组

    /**
     * 增加观察者
     *
     * @param ObServer $ObServer
     */
    public function add(ObServer $ObServer) // 这里是第2步调用的
    {
        $this->ObServers[] = $ObServer; // 注意,这里是把多次增加的观察者类添加进了一个数组
    }

    /**
     * 事件通知
     */
    public function notify()
    {
        foreach ($this->ObServers as $ObServer) { // 通过第3步调用,遍历第2步的数组
            $ObServer->update(); // 调用管擦者类自身的update方法
        }
    }

}

/**
 * 观察者接口类
 *
 * Interface ObServer
 */
interface ObServer
{
    public function update($event_info = null);
}

/**
 * 观察者1
 */
class ObServer1 implements ObServer
{
    public function update($event_info = null)
    {
        echo '观察者1<br>';
    }
}

/**
 * 观察者2
 */
class ObServer2 implements ObServer
{
    public function update($event_info = null)
    {
        echo '观察者2<br>';
    }
}

/**
 * 事件
 *
 * Class Event
 */
class Event extends EventGenerator
{
    /**
     * 触发事件
     */
    public function trigger()
    {
        $this->notify(); // 通知观察者
    }
}

$event = new Event(); // 1.创建一个事件

$event->add(new ObServer1()); // 2.1.添加观察者
$event->add(new ObServer2()); // 2.2.添加观察者

$event->trigger(); // 3.通知观察者
    原文作者:weikaixxxxxx
    原文地址: https://blog.csdn.net/weikaixxxxxx/article/details/89041210
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞