PHP设计模式:观察者模式
admin
2023-06-15 08:02:20
0

首先来看个栗子:

//事件
class EventDemo
{
    //触发了新事件
    public function trigger()
    {
        echo "Event happening\r";

        echo "后续业务更新逻辑1\r\n";

        echo "后续业务更新逻辑2\r\n";

        echo "后续业务更新逻辑3\r\n";
    }
}


场景:当事件发生变化时,触发其他业务进行相关的操作

特征1.所有业务代码都是***式的,直接放置于核心业务当中。

        2.耦合度太高,不便于管理维护。需要一件一件事去做处理。

        


于是我们可以这样假设:

假如后续业务都是都是该事件的关注者,当事件发生改变,只需要通知到观察者即可。其他的工作由观察者自行完成。

类似发布--订阅这种模式。



代码实现:

步骤1.定义观察者接口

步骤2.定义观察者类

步骤3.定义事件产生器(抽象类)

步骤4.定义事件场景类(继承并实现事件产生器抽象类)

步骤5.实例化运用
            实例化事件场景-->添加观察者-->通知


            


定义观察者接口

/**
 * 定义观察者接口(观察对象为事件发生者)
 *Interface Observer
 */
interface Observer
{
    /**
     * 事件发生时,进行更新操作
     * @param null $eventInfo 发生事件的信息
     * @return mixed
     */
    public function update($eventInfo = null);
}

定义观察者类

//定义多个观察者
class Observer1 implements Observer
{
    public function update($eventInfo = null)
    {
        echo "观察者1:准备开始{$eventInfo}
 \r\n";     } } class Observer2 implements Observer {     public function update($eventInfo = null)     {         echo "观察者2:准备开始{$eventInfo}
 \r\n";     } }


定义事件产生器(抽象类)

/**
 * 事件产生者(抽象类)
 * Class EventGenerator
 */
abstract class EventGenerator
{
    private $observers = [];//事件的所有观察者

    /**
     * 增加观察者
     * @return mixed
     */
    public function addObserver(Observer $observer)
    {
        $this->observers[] = $observer;
    }

    /**
     * 通知事件发生了,其他观察者接到通知后更新业务逻辑
     * @return mixed
     */
    public function notify($eventInfo)
    {
        foreach ($this->observers as $observer) {
            $observer->update($eventInfo);
        }
    }
}


定义事件场景类(继承并实现事件产生器抽象类)

/**
 * 定义事件类(继承事件产生者类)
 * Class Event
 */
class Event extends EventGenerator
{
    public function trigger($eventInfo)
    {
        echo "事件 :{$eventInfo} 即将发生,通知观察者们做好更新准备
\r\n";         $this->notify($eventInfo);         echo "
";     } }


主业务场景的实现

$event = new Event();

//此处可以动态添加、删除观察者
$event->addObserver(new Observer1());
//$event->addObserver(new Observer2());


//此处可以发生任意多个事件
$event->trigger('吃饭');

$event->trigger('喝水');
$event->trigger('走路');


至此,我们可以看到在主业务场景中,只需要简单的管理(添加、删除)观察者,管理(添加、删除)发生事件就可以实现简化代码逻辑,减少耦合完成任务。更好的好处是,业务代码解耦合,便于后期的维护扩展。

相关内容

热门资讯

凤凰晚报丨投毒杀人者、 三体公... 今日人物【风暴眼丨中国版“绝命毒师”伏法!揭秘三体原CEO许垚投毒轨迹】“三体公司”原CEO许垚,被...
大润发创始人尹衍樑逝世,享年7... 5月26日,润泰集团证实,润泰集团总裁、唐奖创办人、大润发创始人尹衍樑,于2026年5月26日凌晨4...
全国科技工作者日 |市科协搭台... 科技创新是很多中小企业的“短板”,为帮助企业解决技术难题,5月20日,泰州市科协组织“工博士”科技服...
LLC磁集成变压器厂家梳理 新... 导语:LLC磁集成变压器作为高频变压器领域的技术分支,凭借高功率密度、低损耗等特性,成为新能源、工业...
王坚院士:人工智能已成为最重要... “今天人工智能已经变得跟数学一样基础。大家不要认为人工智能只属于IT行业,甚至不要把它当成一个具体行...
2026年6月企业管控AI工作... 2026年,企业数字化管控进入深水区,销售客资流失、过程难监管、投流转化低、新人成长慢,已成为阻碍企...
爱奇艺被骂惨后,它带着10万个... 作者|周松 原创首发|蓝字计划 爱奇艺AI艺人争议的余温还在,另一门更大的“假人”生意已经站到了港交...
68岁男子出轨“90后”,被指... 5月25日,“妻子状告68岁丈夫向90后女子转账近4800万”一案开庭。红星新闻记者从原告李女士方获...
惊人让步!特朗普的新帖子炸了 北京时间周二早上跟伊朗相关发生两件“大事”。一件是美军轰炸伊朗南部的布雷船和导弹阵地,而在那之前伊朗...
德国华人连环迷奸案,“体面人”... 当地时间5月20日上午,柏林地方法院一楼门外,自发前来旁听的人们沿着狭窄的旋转楼梯,一路排到了三楼。...