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表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
Jan 06 PHP
str_replace只替换一次字符串的方法
Apr 09 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
Jun 08 PHP
PHP获取php,mysql,apche的版本信息示例代码
Jan 16 PHP
ThinkPHP模板Switch标签用法示例
Jun 30 PHP
PHP实现更新中间关联表数据的两种方法
Sep 01 PHP
php中HTTP_REFERER函数用法实例
Nov 21 PHP
PHP中SESSION的注销与清除
Apr 16 PHP
php使用函数pathinfo()、parse_url()和basename()解析URL
Nov 25 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
php输出控制函数和输出函数生成静态页面
Jun 27 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
Sep 16 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 高级课程笔记 面向对象
2009/06/21 PHP
解析php中获取系统信息的方法
2013/06/25 PHP
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
XHTML-Strict 内允许出现的标签
2006/12/11 Javascript
浅析JavaScript中的常用算法与函数
2013/11/21 Javascript
JavaScript生成二维码图片小结
2015/12/27 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
2016/07/07 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
vue把输入框的内容添加到页面的实例讲解
2019/11/11 Javascript
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
Django视图扩展类知识点详解
2019/10/25 Python
python 数据库查询返回list或tuple实例
2020/05/15 Python
Python使用configparser读取ini配置文件
2020/05/25 Python
浅谈python量化 双均线策略(金叉死叉)
2020/06/03 Python
Python的控制结构之For、While、If循环问题
2020/06/30 Python
Python创建临时文件和文件夹
2020/08/05 Python
英国医生在线预约:Top Doctors
2019/10/30 全球购物
HashMap和Hashtable的区别
2013/05/18 面试题
大学生职业生涯规划书范文
2014/01/04 职场文书
建筑安全生产责任书
2014/07/22 职场文书
见习报告怎么写
2014/10/31 职场文书
实习生辞职信范文
2015/03/02 职场文书
特种设备安全管理制度
2015/08/06 职场文书
《风筝》教学反思
2016/02/23 职场文书
python办公自动化之excel的操作
2021/05/23 Python
解决mysql的int型主键自增问题
2021/07/15 MySQL