阅读目录
PHP观察者模式简单示例
- PHP观察者模式简单示例
- PHP观察者模式
- 问题
- 解决
- 被观察者
- 观察者
- 客户端
- 新增观察者
- 特点
- 预览代码
- 实例A
- 实例B
- PHP 观察者模式
当一个对象发生变化时,依赖他的对象全部会收到通知,并自动更新。
# EventGenerator.php
observers[]=$observer;
}
function notify(){
foreach ($this->observers as $observer){
$observer->update();
}
}
}
?>
# 定义一个观察者接口 Observer.php
addObserver(new Observer1());
$event->addObserver(new Observer2());
$event->triger();
$event->notify();
PHP观察者模式
观察者模式,也称发布-订阅模式,定义了一个被观察者和多个观察者的、一对多的对象关系。
在被观察者状态发生变化的时候,它的所有观察者都会收到通知,并自动更新。
观察者模式通常用在实时事件处理系统、组件间解耦、数据库驱动的消息队列系统,同时也是MVC设计模式中的重要组成部分。
以下我们以订单创建为例。
当订单创建后,系统会发送邮件和短信,并保存日志记录。
问题在没有用观察者模式的时候,如下:
class Order
{
// 订单状态
private $state = 0;
// 订单状态有变化时发送通知
public function addOrder()
{
$this->state = 1;
// 发送邮件
Email::update($this->state);
// 短信通知
Message::update($this->state);
// 记录日志
Log::update();
// 其他更多通知
}
}
代码中,在Order类中调用各类的方法来实现通知。当在客户端创建订单:
$order = new Order();
$order->addOrder();
就会同时产生三个通知:发送邮件、发送短信和记录日志。
在系统小的时候,这是非常快捷有效的方式。
可是,当系统变大的时候,这种方法马上面临难以扩展的问题,并且容易出错:
1、如果订单不需要某种通知,比如不需要记录日志,则必须修改Order类,做状态的判断; 2、如果再加一种通知方式,如系统消息通知,则除了增加新类,同时还需要修改Order类和客户端。
这两条都不符合面向对象中的开闭原则,会让系统越来越难维护。
解决接下来我们用观察者模式解决这个问题。
被观察者被观察者是一些具体的实例,比如订单管理、用户登陆、评论回复、状态审核等等。
别的功能会依赖于它们的状态进行各种动作。
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?