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 相关文章推荐
基于mysql的论坛(1)
Oct 09 PHP
推荐php模板技术[转]
Jan 04 PHP
php 仿Comsenz安装效果代码打包提供下载
May 09 PHP
PHP中图片等比缩放的实例
Mar 24 PHP
PHP仿博客园 个人博客(2) 数据库增添改删
Jul 05 PHP
php获取指定范围内最接近数的方法
Jun 02 PHP
学习php设计模式 php实现单例模式(singleton)
Dec 07 PHP
Yii的Srbac插件用法详解
Jul 14 PHP
PHP编写daemon process详解及实例代码
Sep 30 PHP
php组合排序简单实现方法
Oct 15 PHP
PHP实现转盘抽奖算法分享
Apr 15 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 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中文字符截取防乱码
2008/03/28 PHP
phpMyAdmin 安装及问题总结
2009/05/28 PHP
PHP图片处理类 phpThumb参数用法介绍
2012/03/11 PHP
JSON在PHP中的应用介绍
2012/09/08 PHP
php常用字符函数实例小结
2016/12/29 PHP
php读取XML的常见方法实例总结
2017/04/25 PHP
Laravel find in set排序实例
2019/10/09 PHP
javascript事件模型代码
2007/07/01 Javascript
js的闭包的一个示例说明
2008/11/18 Javascript
jQuery html()等方法介绍
2009/11/18 Javascript
读jQuery之三(构建选择器)
2011/06/11 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
jquery+json实现分页效果
2016/03/07 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
关于angular js_$watch监控属性和对象详解
2017/04/24 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
JS实现百度搜索框
2021/02/25 Javascript
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
恢复百度云盘本地误删的文件脚本(简单方法)
2017/10/21 Python
python实现excel读写数据
2021/03/02 Python
pandas如何处理缺失值
2019/07/31 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
实体的生命周期
2013/08/31 面试题
客服工作职责
2013/12/11 职场文书
安全标语大全
2014/06/10 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers
Mybatis 一级缓存和二级缓存原理区别
2022/09/23 Java/Android