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 cookie的操作实现代码(登录)
Dec 29 PHP
PHP rawurlencode与urlencode函数的深入分析
Jun 08 PHP
PHP图片等比例缩放生成缩略图函数分享
Jun 10 PHP
PHP防盗链代码实例
Aug 27 PHP
thinkPHP3.2简单实现文件上传的方法
May 16 PHP
PHP Callable强制指定回调类型的方法
Aug 30 PHP
php实现微信企业付款到个人零钱功能
Oct 09 PHP
PHP去除空数组且数组键名重置的讲解
Feb 28 PHP
PHP进阶学习之类的自动加载机制原理分析
Jun 18 PHP
php常用字符串长度函数strlen()与mb_strlen()用法实例分析
Jun 25 PHP
php抽象类和接口知识点整理总结
Aug 02 PHP
thinkphp5 路由分发原理
Mar 18 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
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
2016/07/21 PHP
Laravel5.1 框架Middleware中间件基本用法实例分析
2020/01/04 PHP
JS中eval函数的使用示例
2013/07/21 Javascript
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
2016/09/29 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
2017/02/27 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
浅谈vue项目优化之页面的按需加载(vue+webpack)
2017/12/11 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
js实现3D旋转相册
2020/08/02 Javascript
python实现udp数据报传输的方法
2014/09/26 Python
python 实现图片旋转 上下左右 180度旋转的示例
2019/01/24 Python
tensorflow 模型权重导出实例
2020/01/24 Python
Keras 数据增强ImageDataGenerator多输入多输出实例
2020/07/03 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
html5 视频播放解决方案
2016/11/06 HTML / CSS
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
西班牙第一的网上药房:PromoFarma.com
2017/04/17 全球购物
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
群胜软件Java笔试题
2012/09/29 面试题
一年级班主任寄语
2014/01/19 职场文书
厨师长岗位职责
2014/03/02 职场文书
冬季施工防火方案
2014/05/17 职场文书
鸟的天堂导游词
2015/01/31 职场文书
人工作失职检讨书
2015/05/05 职场文书
离职证明格式样本
2015/06/12 职场文书
班级班风口号大全
2015/12/25 职场文书