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 相关文章推荐
PHP默认安装产生系统漏洞
Oct 09 PHP
无数据库的详细域名查询程序PHP版(4)
Oct 09 PHP
PHP substr 截取字符串出现乱码问题解决方法[utf8与gb2312]
Dec 16 PHP
php排序算法(冒泡排序,快速排序)
Oct 09 PHP
PHP中使用cURL实现Get和Post请求的方法
Mar 13 PHP
phpmyadmin打开很慢的解决方法
Apr 21 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
[原创]php实现子字符串位置相互对调互换的方法
Jun 02 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
Jun 11 PHP
PDO::inTransaction讲解
Jan 28 PHP
PHP随机数函数rand()与mt_rand()的讲解
Mar 25 PHP
如何在PHP中生成随机数
Jun 04 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
PHP 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
一致性哈希算法以及其PHP实现详细解析
2013/08/24 PHP
PHP Session机制简介及用法
2014/08/19 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
php实现mysql备份恢复分卷处理的方法
2014/12/26 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
用 JSON 处理缓存
2007/04/27 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
尝试动手制作javascript放大镜效果
2015/12/25 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
js滚轮事件兼容性问题需要注意哪些
2016/11/15 Javascript
详解vue-resource promise兼容性问题
2017/06/20 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
浅谈JS和jQuery的区别
2019/03/27 jQuery
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
2019/12/16 Javascript
在Python的Django框架的视图中使用Session的方法
2015/07/23 Python
浅谈python中的getattr函数 hasattr函数
2016/06/14 Python
python实现上传下载文件功能
2020/11/19 Python
Python删除Java源文件中全部注释的实现方法
2017/08/30 Python
tensorflow实现简单的卷积神经网络
2018/05/24 Python
如何验证python安装成功
2020/07/06 Python
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
毕业生实习鉴定
2013/12/11 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
大学生学期个人总结
2015/02/12 职场文书
淮海战役观后感
2015/06/11 职场文书
2016年寒假生活小结
2015/10/10 职场文书
iPhone13 Pro外观确定,升级4800万镜头,4月20日发新品
2021/04/15 数码科技
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python
spring boot中nativeQuery的用法
2021/07/26 Java/Android
关于 Python json中load和loads区别
2021/11/07 Python