简介: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);
最后提醒大家,如果使用框架开发,不需要自己去实现观察者模式。大部分框架已经封装好了,只需要定义观察者,在配置文件中将观察者添加到事件中即可。后续如果有时间,我会针对不同的框架进行讲解框架中观察者模式的使用。
有遗漏或者不对的可以在我的公众号留言哦