PHP观察者模式
2022/2/22 17:27:39
本文主要是介绍PHP观察者模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
观察者模式定义:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
观察者模式有四个角色:
抽象通知者角色(Subject):定义了通知的接口规则。
具体通知者角色(ConcreteSubject):实现抽象通知者的接口,接到状态改变向观察者下发通知。
抽象观察者角色(Observer):定义接到通知后所做的操作接口规则。
具体观察者角色(JingDong):实现具体操作方法。
考虑这样一种场景,有个电商平台,每天都要统计客户数据和订单数据,那么就可以定义一个类(Subject),当每天时间发生变化时,就要通知更新客户数据(Observer)和订单数据(Observer)。
本代码基于Yii2.0 具体通知者类: <?php namespace common\services; use Yii; use SplObserver; class SubjectService implements \SplSubject { protected $observers; public function __construct() { $this->observers = new \SplObjectStorage(); } /** * 获取参数 * @return mixed */ public function getParams() { return $this->observers->getInfo(); } /** * 添加观察者 * @param SplObserver $observer * @param null $params */ public function attach(SplObserver $observer,$params = null) { $this->observers->attach($observer,$params); } /** * 移除观察者 * @param SplObserver $observer */ public function detach(SplObserver $observer) { $this->observers->detach($observer); } /** * 通知观察者 */ public function notify() { foreach ($this->observers as $obj) { try { $obj->update($this); } catch (\Throwable $e) { } } } }
具体观察者类:
<?php namespace common\services; use Yii; use SplSubject; use common\services\SubjectService;
/** * 客户统计类 * Class UserObserverService * * @package common\services */ class UserObserverService implements \SplObserver { /** *更新数据 * @param SplSubject $subject */ public function update(SplSubject $subject) { //获取参数 $params = $subject->getParams(); //统计数据 $this->statData($params); } /** *统计客户数据 * @param $params */ public function statData($params) { echo "stat user data"; } }
<?php namespace common\services; use Yii; use SplSubject; use common\services\SubjectService; /** * 订单统计类 * Class OrderObserverService * * @package common\services */ class OrderObserverService implements \SplObserver { /** *更新数据 * @param SplSubject $subject */ public function update(SplSubject $subject) { //获取参数 $params = $subject->getParams(); //统计数据 $this->statData($params); } /** *统计订单数据 * @param $params */ public function statData($params) { echo "stat order data"; } } 测试类:
<?php namespace backend\controllers; use common\services\SubjectService; use common\services\UserObserverService; use common\services\OrderObserverService; use Yii; use yii\web\Controller; class ObserverTestController extends Controller { /** * 测试 */ public function actionIndex() { $day = date('Y-m-d'); $subject = \Yii::createObject(SubjectService::class); $subject->attach(new UserObserverService(),['day'=>$day]); $subject->attach(new OrderObserverService(),['day'=>$day]); $subject->notify(); } }
这篇关于PHP观察者模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-09-28怎么把PHP程序打包?-icode9专业技术文章分享
- 2024-09-28怎么用Phar打包PHP程序?-icode9专业技术文章分享
- 2024-09-13手动在github上下载的mfpt包,怎么放到thinkphp5.0框架并正常使用-icode9专业技术文章分享
- 2024-09-05python的<class 'bytearray'>相当于php的哪个数据类型-icode9专业技术文章分享
- 2024-09-05php 导出银行卡号避免科学技术法的方法-icode9专业技术文章分享
- 2024-08-30什么样的php代码质量差被称为垃圾代码-icode9专业技术文章分享
- 2024-08-30用 PHP 调用拼多多的接口以获取订单状态消息的步骤方法和代码示例-icode9专业技术文章分享
- 2024-08-27phpunit单元测试框架的入门和使用方法介绍-icode9专业技术文章分享
- 2024-08-24PHP 中date("w") 周一是多少-icode9专业技术文章分享
- 2024-08-14thinkphp8.0获取域名或主机名方法-icode9专业技术文章分享