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

本文深入解析了观察者模式的核心概念及其实现方式,通过PHP代码示例展示了如何定义对象间的一对多依赖关系,实现对象状态改变时的自动通知与更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

<?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.通知观察者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值