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应用程序来获取Web服务器的状态信息
Oct 09 PHP
模拟SQLSERVER的两个函数:dateadd(),datediff()
Oct 09 PHP
php flush类输出缓冲剖析
Oct 19 PHP
PHP 通过Socket收发十六进制数据的实现代码
Aug 16 PHP
PHP中time(),date(),mktime()区别介绍
Sep 28 PHP
php获取中文拼音首字母类和函数分享
Apr 24 PHP
PHP统计目录大小的自定义函数分享
Nov 18 PHP
php递归法读取目录及文件的方法
Jan 30 PHP
PHP Streams(流)详细介绍及使用
May 12 PHP
详解PHP处理密码的几种方式
Nov 30 PHP
PHP使用PDO调用mssql存储过程的方法示例
Oct 07 PHP
php intval函数用法总结
Apr 14 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网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
php清除和销毁session的方法分析
2015/03/19 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
yii框架结合charjs统计上一年与当前年数据的方法示例
2020/04/04 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
2020/04/27 PHP
jquery Easyui快速开发总结
2015/08/20 Javascript
在JavaScript中如何解决用execCommand(
2015/10/19 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
2016/04/17 Javascript
Bootstrap Metronic完全响应式管理模板之菜单栏学习笔记
2016/07/08 Javascript
浅析vue数据绑定
2017/01/17 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
vue2.0父子组件间传递数据的方法
2018/08/16 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
2018/10/08 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
微信小程序云开发 生成带参小程序码流程
2019/05/18 Javascript
jQuery中DOM常见操作实例小结
2019/08/01 jQuery
jQuery实现雪花飘落效果
2020/08/02 jQuery
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
学习python类方法与对象方法
2016/03/15 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
Python Cookie 读取和保存方法
2018/12/28 Python
Django获取应用下的所有models的例子
2019/08/30 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
乌克兰鞋类购物网站:Eobuv.com.ua
2020/11/28 全球购物
采购部部门职责
2013/12/15 职场文书
企业内控岗位的职责
2014/02/07 职场文书
调解员先进事迹材料
2014/02/07 职场文书
视光学毕业生自荐书范文
2014/02/13 职场文书
2014年前台文员工作总结
2014/12/08 职场文书
创业计划书之冷饮店
2019/09/27 职场文书