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 相关文章推荐
3
Oct 09 PHP
真正面向对象编程:PHP5.01发布
Oct 09 PHP
在数据量大(超过10万)的情况下
Jan 15 PHP
发布一个用PHP fsockopen写的HTTP下载的类
Feb 22 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
May 08 PHP
php实现用于删除整个目录的递归函数
Mar 16 PHP
php简单操作mysql数据库的类
Apr 16 PHP
PHP中Restful api 错误提示返回值实现思路
Apr 12 PHP
PHP中addslashes与mysql_escape_string的区别分析
Apr 25 PHP
浅析Yii2缓存的使用
May 10 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
PHP count()函数讲解
Feb 03 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 MySQL应用中使用XOR运算加密算法分享
2011/08/28 PHP
Yii使用find findAll查找出指定字段的实现方法
2014/09/05 PHP
php通过sort()函数给数组排序的方法
2015/03/18 PHP
PHP导入导出Excel代码
2015/07/07 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
PHP如何使用cURL实现Get和Post请求
2020/07/11 PHP
漂亮的仿flash菜单,来自蓝色经典
2006/06/26 Javascript
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
2013/06/25 Javascript
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
兼容主流浏览器的jQuery+CSS 实现遮罩层的简单代码
2014/10/14 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
javascript实现鼠标移到Image上方时显示文字效果的方法
2015/08/07 Javascript
JS深度拷贝Object Array实例分析
2016/03/31 Javascript
JavaScript的instanceof运算符学习教程
2016/06/08 Javascript
jquery siblings获取同辈元素用法实例分析
2016/07/25 Javascript
node文件上传功能简易实现代码
2017/06/16 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
JavaScript实现仿Clock ISO时钟
2018/06/29 Javascript
详解vue引入子组件方法
2019/02/12 Javascript
JS实现拖拽元素时与另一元素碰撞检测
2020/08/27 Javascript
[01:45]亚洲邀请赛互动指南虚拟物品介绍
2015/01/30 DOTA
使用Python操作excel文件的实例代码
2017/10/15 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
2018/03/04 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
python scipy卷积运算的实现方法
2019/09/16 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
用python拟合等角螺线的实现示例
2019/12/27 Python
PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)的步骤详解
2020/11/02 Python
如何基于Python pygame实现动画跑马灯
2020/11/18 Python
校庆口号
2014/06/20 职场文书
邮政竞聘演讲稿
2014/09/03 职场文书
2014会计年终工作总结
2014/12/20 职场文书
婚宴主持词
2015/06/30 职场文书
五年级作文之成长
2019/09/16 职场文书
Mysql如何查看是否使用到索引
2022/12/24 MySQL