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截取汉字乱码问题解决方法mb_substr函数的应用
Mar 30 PHP
php表单转换textarea换行符的方法
Sep 10 PHP
php中用数组的方法设置cookies
Apr 21 PHP
PHP测试程序运行时间的类
Feb 05 PHP
PHP获取http请求的头信息实现步骤
Dec 16 PHP
php selectradio和checkbox默认选择的实现方法详解
Jun 29 PHP
一个经典的PHP验证码类分享
Nov 18 PHP
php浏览历史记录的方法
Mar 10 PHP
php上传大文件失败的原因及应对策略
Oct 20 PHP
PHP面向对象多态性实现方法简单示例
Sep 27 PHP
浅谈laravel5.5 belongsToMany自身的正确用法
Oct 17 PHP
one.php 多项目、函数库、类库 统一为一个版本的方法
Aug 24 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
咖啡与水的关系
2021/03/03 冲泡冲煮
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
YII框架常用技巧总结
2019/04/27 PHP
JavaScript传递变量: 值传递?引用传递?
2011/02/22 Javascript
js判断浏览器版本以及浏览器内核的方法
2015/01/20 Javascript
浅析JavaScript声明变量
2015/12/21 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
2016/01/05 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
jquery获取file表单选择文件的路径、名字、大小、类型
2019/01/18 jQuery
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
js实现简单的无缝轮播效果
2020/09/05 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
python迭代器与生成器详解
2016/03/10 Python
python的paramiko模块实现远程控制和传输示例
2017/10/13 Python
Pandas标记删除重复记录的方法
2018/04/08 Python
python opencv 实现对图像边缘扩充
2020/01/19 Python
python 根据列表批量下载网易云音乐的免费音乐
2020/12/03 Python
简述安装Slackware Linux系统的过程
2012/01/12 面试题
计算机网络专业个人的自我评价
2013/10/17 职场文书
房地产出纳岗位职责
2013/12/01 职场文书
技校毕业生的自我评价
2013/12/27 职场文书
超市开店计划书
2014/04/26 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
国家助学贷款承诺书
2015/04/30 职场文书
开学典礼校长致辞
2015/07/29 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
python实现监听键盘
2021/04/26 Python
vue3中provide && inject的使用
2021/07/01 Vue.js