PHP——观察者模式

观察者模式是非常有用的设计模式,事件机制,发布订阅等都是基于观察者模式实现的。
观察者模式顾名思义要有“观察者”和“被观察者”,为了约束两者的行为,又需要各自的接口(Interface)。我们来实现一个Demo:

ObserverInterface.php

<?php

/**
 * Interface ObserverInterface 观察者接口
 */
interface ObserverInterface
{
    /**
     * 收到主题通知后执行相应的反馈
     * @return mixed
     */
    public function response();
}

ObserverA.php

<?php
require_once 'ObserverInterface.php';

/**
 * Class ObserverA 第一种观察者
 */
class ObserverA implements ObserverInterface
{
    public function response()
    {
        echo '观察者A已收到' . PHP_EOL;
    }
}

ObserverB.php

<?php

/**
 * Class ObserverB 第二种观察者
 */
class ObserverB implements ObserverInterface
{
    public function response()
    {
        echo 'Observer B has received the notify' . PHP_EOL;
    }

    public function ohter()
    {
        echo '该种观察者独有的方法';
    }
}

SubjectInterface.php

<?php

/**
 * Interface SubjectInterface 主题接口
 */
interface SubjectInterface
{
    /**
     * @param ObserverInterface $observer
     */
    public function add(ObserverInterface $observer);

    /**
     * 通知观察者
     */
    public function notify();
}

Subject.php

<?php
require_once 'SubjectInterface.php';

/**
 * Class Subject 被观察的对象
 */
class Subject implements SubjectInterface
{
    /**
     * @var $observers Observer
     */
    private $observers;

    /**
     * @param ObserverInterface $observer 注册观察者实体
     */
    public function add(ObserverInterface $observer)
    {
        $this->observers[] = $observer;
    }

    /**
     * 发送通知
     */
    public function notify()
    {
        // 逐个通知观察者
        foreach ($this->observers as $observer) {
            $observer->response();
        }
    }
}

下面我们来模拟一下场景

<?php
require_once 'Subject.php';
require_once 'ObserverA.php';
require_once 'ObserverB.php';
//观察者模式

$Subject = new Subject();
$Subject->add(new ObserverA());
$Subject->add(new ObserverB());
$Subject->notify();

执行结果:

观察者A已收到
Observer B has received the notify
原文地址:https://www.cnblogs.com/shaoyikai/p/13539976.html