php中的观察者模式简单实例


Posted in PHP onJanuary 20, 2015

观察者模式是设计模式中比较常见的一个模式,包含两个或者更多的互相交互的类。这一模式允许某个类观察另外一个类的状态,当被观察类的状态发生变化时候,观察者会进行得到通知进而更新相应状态。

php的SPL标准类库提供了SplSubject和SplObserver接口来实现,被观察的类叫subject,负责观察的类叫observer。这一模式是SplSubject类维护了一个特定状态,

当这个状态发生变化时候,它就会调用notify方法。调用notify方法时,所有之前使用attach方法注册的SplObserver实例的update方法都会调用,Demo如下:

class DemoSubject implements SplSubject{

    private $observers, $value;

 

    public function __construct(){

        $this->observers = array();

    }

 

    public function attach(SplObserver $observer){

        $this->observers[] = $observer;

    }

 

    public function detach(SplObserver $observer){

        if($idx = array_search($observer, $this->observers, true)){

            unset($this->observers[$idx]);

        }

    }

 

    public function notify(){

        foreach($this->observers as $observer){

            $observer->update($this);

        }

    }

 

    public function setValue($value){

        $this->value = $value;

        $this->notify();

    }

 

    public function getValue(){

        return $this->value;

    }

}

 

class DemoObserver implements SplObserver{

    public function update(SplSubject $subject){

        echo 'The new value is '. $subject->getValue();

    }

}

 

$subject = new DemoSubject();

$observer = new DemoObserver();

$subject->attach($observer);

$subject->setValue(5);
PHP 相关文章推荐
pw的一个放后门的方法分析
Oct 08 PHP
ecshop 订单确认中显示省市地址信息的方法
Mar 15 PHP
PHP数据类型的总结分析
Jun 13 PHP
PHP下载生成的csv文件及问题总结
Aug 06 PHP
php+ajax无刷新上传图片实例代码
Nov 17 PHP
在WordPress中安装使用视频播放器插件Hana Flv Player
Jan 04 PHP
PHP正则表达式入门教程(推荐)
May 18 PHP
php判断是否为ajax请求的方法
Nov 29 PHP
php数组和链表的区别总结
Sep 20 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 PHP
php获取是星期几的的一些常用姿势
Dec 15 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 PHP
php 5.6版本中编写一个PHP扩展的简单示例
Jan 20 #PHP
PHP函数extension_loaded()用法实例
Jan 19 #PHP
php使用正则表达式获取图片url的方法
Jan 16 #PHP
php使用CURL伪造IP和来源实例详解
Jan 15 #PHP
php+mysql实现无限分类实例详解
Jan 15 #PHP
php截取html字符串及自动补全html标签的方法
Jan 15 #PHP
php在linux下检测mysql同步状态的方法
Jan 15 #PHP
You might like
第三节--定义一个类
2006/11/16 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
PHP 实现explort() 功能的详解
2013/06/20 PHP
php判断两个日期之间相差多少个月份的方法
2015/06/18 PHP
基于jquery的finkyUI插件与Ajax实现页面数据加载功能
2010/12/03 Javascript
js Function类型
2011/12/04 Javascript
通过JS动态创建一个html DOM元素并显示
2014/10/15 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
jQuery实现鼠标经过像翻页和描点链接效果
2016/08/08 Javascript
AngularJS 自定义指令详解及示例代码
2016/08/17 Javascript
Bootstrap select实现下拉框多选效果
2016/12/23 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
新手入门js闭包学习过程解析
2019/10/08 Javascript
vue Tab切换以及缓存页面处理的几种方式
2019/11/05 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
Python中的类学习笔记
2014/09/23 Python
python函数装饰器用法实例详解
2015/06/04 Python
Python随机数random模块使用指南
2016/09/09 Python
Python爬虫框架Scrapy实例代码
2018/03/04 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
Flask之flask-session的具体使用
2018/07/26 Python
django之跨表查询及添加记录的示例代码
2018/10/16 Python
python多进程控制学习小结
2018/10/31 Python
Pandas 按索引合并数据集的方法
2018/11/15 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
Django app配置多个数据库代码实例
2019/12/17 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
Python读写Excel表格的方法
2021/03/02 Python
《伯牙绝弦》教学反思
2014/03/02 职场文书
学历公证书范本
2014/04/09 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书