PHP设计模式-观察者模式

简介:PHP设计模式-观察者模式

1.定义

当一个对象的状态发生改变时,依赖他的对象全部收到通知并自动更新

2.使用场景

一个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理逻辑。当更新的逻辑增加后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件主体代码。

观察者模式实现了低耦合,非侵入式的通知与更新机制。

3.实现观察者模式

我们今天就以注册为例。用户注册时除了需要将用户添加到用户表之外,还需要添加积分,发放优惠券,绑定上下级关系等其他逻辑。随着业务逻辑越来越多,代码也会越来越复杂,如果我们使用观察者模式将发放优惠券,绑定上下级关系分成一个一个观察者是不是就可以实现解耦呢?

<?php

/**
 * 定义接口
 * 为了更好的实现观察者模式,我们需要定义一个规范,所有观察者都需要遵守该规范
 * Interface Observer
 */
interface Observer {
    public function update($param);
}

/**
 * 定义用户注册添加积分记录服务类
 */
class RegisterIntegralServer implements Observer {
    /**
     * 实现观察者模式必要的方法
     * @param $user_id 外部需要将用户id传过来
     */
    public function update($user_id)
    {
        echo '实现用户注册添加积分记录,用户id:'.$user_id.PHP_EOL;
    }
}


/**
 * 定义抽象类
 * 事件类有通用的方法函数,所以我们用抽象类来定义基类。具体的事件类只需要将继承本抽象类即可
 * Class EventGenerator
 */
abstract class EventGenerator {
    //存储通知服务对象的容器
    private $observer = array();
    //添加通知对象
    public function addObserver(Observer $observer)
    {
        $this->observer[] = $observer;
    }

    //通知服务对象
    public function notify($param)
    {
        foreach ($this->observer as $item) {
            $item->update($param);
        }
    }
}

/**
 * 定义注册事件并继承事件的抽象基类
 */
class RegisterEvent extends EventGenerator {
    //初始化注册事件类时,添加注册事件相关的服务
    public function __construct()
    {
        //用户注册时调用添加积分服务
        $this->addObserver(new RegisterIntegralServer());
        //后续可以添加用户注册相关优惠券等服务
    }
}

//用户注册验证参数等信息
//添加用户信息等,注册成功获得用户id
$user_id = 1;
//用户注册成功后调用注册事件通知需要更新的服务
(new RegisterEvent())->notify($user_id);

最后提醒大家,如果使用框架开发,不需要自己去实现观察者模式。大部分框架已经封装好了,只需要定义观察者,在配置文件中将观察者添加到事件中即可。后续如果有时间,我会针对不同的框架进行讲解框架中观察者模式的使用。

 

有遗漏或者不对的可以在我的公众号留言哦

编程经验共享公众号二维码

编程经验共享公众号二维码
更多内容关注公众号
Copyright © 2021 编程经验共享 赣ICP备2021010401号-1