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 相关文章推荐
discuz7 phpMysql操作类
Jun 21 PHP
php 中文和编码判断代码
May 16 PHP
php基础学习之变量的使用
Jun 09 PHP
关于PHP实现异步操作的研究
Feb 03 PHP
利用php下载xls文件(自己动手写的)
Apr 18 PHP
PHP中使用CURL模拟登录并获取数据实例
Jul 01 PHP
PHP中IP地址与整型数字互相转换详解
Aug 20 PHP
PHP并发多进程处理利器Gearman使用介绍
May 16 PHP
php编译安装php-amq扩展简明教程
Jun 25 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
Sep 22 PHP
使用YII2框架实现微信公众号中表单提交功能
Sep 04 PHP
PHP一致性hash分布式算法封装类定义与用法示例
Aug 04 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
1 Tube Radio
2021/03/02 无线电
php 图片上传类代码
2009/07/17 PHP
php将日期格式转换成xx天前的格式
2015/04/16 PHP
PHP常见加密函数用法示例【crypt与md5】
2019/01/27 PHP
JavaScript的document对象和window对象详解
2010/12/30 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
基于JavaScript代码实现pc与手机之间的跳转
2015/12/23 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
基于Bootstrap和JQuery实现动态打开和关闭tab页的实例代码
2019/06/10 jQuery
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
用python读写excel的方法
2014/11/18 Python
python读取json文件并将数据插入到mongodb的方法
2015/03/23 Python
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
Python reduce()函数的用法小结
2017/11/15 Python
python贪婪匹配以及多行匹配的实例讲解
2018/04/19 Python
python+pyqt5实现24点小游戏
2019/01/24 Python
pow在python中的含义及用法
2019/07/11 Python
matlab灰度图像调整及imadjust函数的用法详解
2020/02/27 Python
Python pandas如何向excel添加数据
2020/05/22 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
Python中Yield的基本用法
2020/10/18 Python
Django REST Framework 分页(Pagination)详解
2020/11/30 Python
对CSS3选择器的研究(详解)
2016/09/16 HTML / CSS
iframe在移动端的缩放的示例代码
2018/10/12 HTML / CSS
美国男女折扣服饰百货连锁店:Stein Mart
2017/05/02 全球购物
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
出租房屋协议书
2014/09/14 职场文书
2014年生产部工作总结
2014/12/17 职场文书
运动会通讯稿50字
2015/07/20 职场文书
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫