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面向对象编程快速入门
Oct 09 PHP
推荐Discuz!5的PHP代码高亮显示与实现可运行代码
Mar 15 PHP
PHP 字符串 小常识
Jun 05 PHP
PHP 文章中的远程图片采集到本地的代码
Jul 30 PHP
PHP获取文件绝对路径的代码(上一级目录)
May 29 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
Jun 26 PHP
php使用glob函数快速查询指定目录文件的方法
Nov 15 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
May 28 PHP
php实现算术验证码功能
Dec 05 PHP
php json转换相关知识(小结)
Dec 21 PHP
PHP goto语句用法实例
Aug 06 PHP
基于php解决json_encode中文UNICODE转码问题
Nov 10 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
php注册登录系统简化版
2020/12/28 PHP
html读出文本文件内容
2007/01/22 Javascript
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
JavaScript中奇葩的假值示例应用
2014/03/11 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
浅谈javascript事件取消和阻止冒泡
2015/05/26 Javascript
纯js实现无限空间大小的本地存储
2015/06/18 Javascript
为什么要使用Vuex的介绍
2019/01/19 Javascript
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
Jquery cookie插件实现原理代码解析
2020/08/04 jQuery
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
使用SAE部署Python运行环境的教程
2015/05/05 Python
Ubuntu 16.04 LTS中源码安装Python 3.6.0的方法教程
2016/12/27 Python
详解Python pygame安装过程笔记
2017/06/05 Python
浅谈pycharm的xmx和xms设置方法
2018/12/03 Python
Python 字符串类型列表转换成真正列表类型过程解析
2019/08/26 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
使用Python绘制台风轨迹图的示例代码
2020/09/21 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
英国床垫在线:Mattress Online
2016/12/07 全球购物
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
最新计算机专业自荐信
2013/10/16 职场文书
简历中的自我评价范文
2014/02/05 职场文书
销售主管岗位职责范本
2014/02/14 职场文书
村党支部群众路线教育实践活动对照检查材料
2014/09/26 职场文书
邀请书模板
2015/02/02 职场文书
2015年爱牙日活动总结
2015/02/05 职场文书
夏洛特的网观后感
2015/06/15 职场文书
2015年学校总务工作总结
2015/07/20 职场文书
会议室管理制度范本
2015/08/06 职场文书
创业计划书之干洗店
2019/09/10 职场文书
Python中使用Opencv开发停车位计数器功能
2022/04/04 Python