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 数据同步
Oct 09 PHP
模仿OSO的论坛(五)
Oct 09 PHP
php preg_match_all结合str_replace替换内容中所有img
Oct 11 PHP
php下安装配置fckeditor编辑器的方法
Mar 02 PHP
apache和php之间协同工作的配置经验分享
Apr 08 PHP
zf框架db类的分页示例分享
Mar 14 PHP
php微信公众开发之获取周边酒店信息的方法
Dec 22 PHP
php中JSON的使用与转换
Jan 14 PHP
详解WordPress中用于更新和获取用户选项数据的PHP函数
Mar 08 PHP
Yii2实现让关联字段支持搜索功能的方法
Aug 10 PHP
PHP中STDCLASS用法实例分析
Nov 11 PHP
详解php协程知识点
Sep 21 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计算数组相同值出现次数的代码(array_count_values)
2015/01/20 PHP
替换php字符串中的单引号为双引号的方法
2017/02/16 PHP
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
jQuery MD5加密实现代码
2010/03/15 Javascript
基于jquery的获取浏览器窗口大小的代码
2011/03/28 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
自定义的一个简单时尚js下拉选择框
2013/11/20 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
javascript实现五星评价代码(源码下载)
2015/08/11 Javascript
理解javascript中的with关键字
2016/02/15 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
JavaScript ES6中CLASS的使用详解
2016/11/22 Javascript
深入理解Angularjs中$http.post与$.post
2017/05/19 Javascript
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
js 两个日期比较相差多少天的实例
2017/10/19 Javascript
parabola.js抛物线与加入购物车效果的示例代码
2017/10/25 Javascript
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
jQuery事件委托代码实践详解
2019/06/21 jQuery
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
Python中的ctime()方法使用教程
2015/05/22 Python
将tensorflow的ckpt模型存储为npy的实例
2018/07/09 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
pandas 对日期类型数据的处理方法详解
2019/08/08 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
详解快速开发基于 HTML5 网络拓扑图应用
2018/01/08 HTML / CSS
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
澳大利亚运动鞋零售商:The Athlete’s Foot
2018/11/04 全球购物
Why we need EJB
2016/10/20 面试题
社会体育专业大学生职业生涯规划书
2014/09/17 职场文书
公司离职证明范本
2014/10/17 职场文书
庆祝教师节活动总结
2015/03/23 职场文书