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初学者头痛的十四个问题
Jul 12 PHP
简单的php 验证图片生成函数
May 21 PHP
PHP连接MongoDB示例代码
Sep 06 PHP
深入php socket的讲解与实例分析
Jun 13 PHP
如何使用PHP实现javascript的escape和unescape函数
Jun 29 PHP
php实现的获取网站备案信息查询代码(360)
Sep 23 PHP
PHP命名空间(namespace)的使用基础及示例
Aug 18 PHP
PHP中字符安全过滤函数使用小结
Feb 25 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
Yii2增加验证码步骤详解
Apr 25 PHP
基于PHPexecl类生成复杂的报表表头示例
Oct 14 PHP
PHP中SESSION过期设置
Mar 09 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
不用数据库的多用户文件自由上传投票系统(1)
2006/10/09 PHP
php 生成自动创建文件夹并上传文件的示例代码
2014/03/07 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
2016/07/21 PHP
js实现文本框中焦点在最后位置
2014/03/04 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
JavaScript之AOP编程实例
2015/07/17 Javascript
利用canvas实现的加载动画效果实例代码
2017/07/05 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
vue动画打包后失效问题的解决方法
2018/09/18 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
关于Js中new操作符的作用详解
2021/02/21 Javascript
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
详解在Python程序中自定义异常的方法
2015/10/16 Python
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
Python3生成手写体数字方法
2018/01/30 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
python读取文本中的坐标方法
2018/10/14 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
医学生实习自荐信
2013/10/01 职场文书
高中美术教学反思
2014/01/19 职场文书
小学生综合素质评语
2014/04/23 职场文书
甜品店创业计划书
2014/08/14 职场文书
在职员工证明书
2014/09/19 职场文书
工作保证书怎么写
2015/02/28 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
科级干部培训心得体会
2016/01/06 职场文书
安全生产协议书
2016/03/22 职场文书
详解Python中下划线的5种含义
2021/07/15 Python