PHP观察者模式原理与简单实现方法示例


Posted in PHP onAugust 25, 2017

本文实例讲述了PHP观察者模式原理与简单实现方法。分享给大家供大家参考,具体如下:

当一个对象状态发生改变后,会影响到其他几个对象的改变,这时候可以用观察者模式。像wordpress这样的应用程序中,它容外部开发组开发插件,比如用户授权的博客统计插件、积分插件,这时候可以应用观察者模式,先注册这些插件,当用户发布一篇博文后,就回自动通知相应的插件更新。

观察者模式符合接口隔离原则,实现了对象之间的松散耦合。

观察者模式UML图:

PHP观察者模式原理与简单实现方法示例

在php SPL中已经提供SplSubject和SqlOberver接口

interface SplSubject
{
  function attach(SplObserver $observer);
  function detach(SplObserver $observer);
  function notify();
}
interface SqlObserver
{
  function update(SplSubject $subject);
}

下面具体实现上面例子

class Subject implements SplSubject
{
  private $observers;
  public function attach(SplObserver $observer)
  {
    if (!in_array($observer, $this->observers)) {
      $this->observers[] = $observer;
    }
  }
  public function detach(SplObserver $observer)
  {
    if (false != ($index = array_search($observer, $this->observers))) {
      unset($this->observers[$index]);
    }
  }
  public function post()
  {
    //post相关code
    $this->notify();
  }
  private function notify()
  {
    foreach ($this->observers as $observer) {
      $observer->update($this);
    }
  }
  public function setCount($count)
  {
    echo "数据量加" . $count;
  }
  public function setIntegral($integral)
  {
     echo "积分量加" . $integral;
  }
}
class Observer1 implements SplObserver
{
  public function update($subject)
  {
    $subject-> setCount(1);
  }
}
class Observer2 implements SplObserver
{
  public function update($subject)
  {
    $subject-> setIntegral(10);
  }
}
class Client
{
  public function test()
  {
    $subject = new Subject();
    $subject->attach(new Observer1());
    $subject->attach(new Observer2());
    $subject->post();//输出:数据量加1 积分量加10
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP脚本的10个技巧(1)
Oct 09 PHP
php下通过POST还是GET来传值
Jun 05 PHP
php 数组使用详解 推荐
Jun 02 PHP
php 数据库字段复用的基本原理与示例
Jul 22 PHP
Php Ctemplate引擎开发相关内容
Mar 03 PHP
PHP 常用数组内部函数(Array Functions)介绍
Jun 05 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
Nov 04 PHP
PHP实现过滤各种HTML标签
May 17 PHP
谈谈PHP中substr和substring的正确用法及相关参数的介绍
Dec 16 PHP
thinkPHP使用pclzip打包备份mysql数据库的方法
Apr 30 PHP
php表单处理操作
Nov 16 PHP
PHP实现一个限制实例化次数的类示例
Sep 16 PHP
PHP实现的策略模式简单示例
Aug 25 #PHP
php实现简单的权限管理的示例代码
Aug 25 #PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 #PHP
Laravel中前端js上传图片到七牛云的示例代码
Sep 04 #PHP
使用YII2框架实现微信公众号中表单提交功能
Sep 04 #PHP
PHP实现批量重命名某个文件夹下所有文件的方法
Sep 04 #PHP
PHP读取、解析eml文件及生成网页的方法示例
Sep 04 #PHP
You might like
冰滴咖啡制作步骤
2021/03/03 冲泡冲煮
功能强大的php文件上传类
2016/08/29 PHP
Yii2.0 RESTful API 基础配置教程详解
2018/12/26 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
Js 本页面传值实现代码
2009/05/17 Javascript
JavaScript的document对象和window对象详解
2010/12/30 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
jQuery中:has选择器用法实例
2014/12/30 Javascript
HTML5使用DeviceOrientation实现摇一摇功能
2015/06/05 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
JavaScript实现多栏目切换效果
2016/12/12 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
Vue.js在数组中插入重复数据的实现代码
2017/11/17 Javascript
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
node获取客户端ip功能简单示例
2019/08/24 Javascript
js实现轮播图特效
2020/05/28 Javascript
vue等两个接口都返回结果再执行下一步的实例
2020/09/08 Javascript
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
python安装本地whl的实例步骤
2019/10/12 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
python中def是做什么的
2020/06/10 Python
土耳其风格手工珠宝:Ottoman Hands
2019/07/26 全球购物
建筑工程专业毕业生自荐信
2013/10/19 职场文书
酒店司机岗位职责
2013/12/14 职场文书
售后服务承诺书模板
2014/05/21 职场文书
交通安全标语
2014/06/06 职场文书
个人存款证明书
2014/10/18 职场文书
继承权公证书范本
2015/01/23 职场文书
三峡大坝导游词
2015/01/31 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL