PHP 设计模式之观察者模式介绍


Posted in PHP onFebruary 22, 2012

介绍
观察者模式定义对象的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新!
设计原则
在观察者模式中,会改变的是主题的状态以及观察者的数目。用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题。——找出程序中会变化的方面,然后将其和固定不变的方面相分离!
主题和观察者都使用接口:观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。这样可以让两者之间运作正常,又同时具有松耦合的优点! ——针对接口编程,不针对实现编程!

观察者模式利用“组合”将许多观察者组合进主题中。对象(观察者——主题)之间的这种关系不是通过继承产生的,而是在运行时利用组合的方式产生的。 ——多用组合,少用继承!
代码

<?php 
/** 
* 观察者模式 
* @author: Mac 
* @date: 2012/02/22 
*/ 
class Paper{ /* 主题 */ 
private $_observers = array(); 
public function register($sub){ /* 注册观察者 */ 
$this->_observers[] = $sub; 
} 
public function trigger(){ /* 外部统一访问 */ 
if(!empty($this->_observers)){ 
foreach($this->_observers as $observer){ 
$observer->update(); 
} 
} 
} 
} 
/** 
* 观察者要实现的接口 
*/ 
interface Observerable{ 
public function update(); 
} 
class Subscriber implements Observerable{ 
public function update(){ 
echo "Callback\n"; 
} 
} 
//下面是测试代码 
? 
/* 测试 */ 
$paper = new Paper(); 
$paper->register(new Subscriber()); 
//$paper->register(new Subscriber1()); 
//$paper->register(new Subscriber2()); 
$paper->trigger();

总结

当新对象要填入的时候,只需要在主题(又叫可观察者)中进行注册(注册方式很多,你也可以在构造的时候,或者框架访问的接口中进行注册),然后实现代码直接在新对象的接口中进行。这降低了主题对象和观察者对象的耦合度。

好的设计模式不会直接进入你的代码中,而是进入你的大脑中。

PHP 相关文章推荐
使用Xdebug调试和优化PHP程序之[1]
Apr 17 PHP
php下实现在指定目录搜索指定类型文件的函数
Oct 03 PHP
批量修改RAR文件注释的php代码
Nov 20 PHP
PHP删除非空目录的函数代码小结
Feb 28 PHP
与文件上传有关的php配置参数总结
Jun 14 PHP
php出现内存位置访问无效错误问题解决方法
Aug 16 PHP
php实现refresh刷新页面批量导入数据的方法
Dec 23 PHP
php实现通用的信用卡验证类
Mar 24 PHP
php脚本守护进程原理与实现方法详解
Jul 20 PHP
PHP检查URL包含特定字符串实例方法
Feb 11 PHP
PHP iconv()函数字符编码转换的问题讲解
Mar 22 PHP
php装饰者模式简单应用案例分析
Oct 23 PHP
php模拟post行为代码总结(POST方式不是绝对安全)
Feb 22 #PHP
用穿越火线快速入门php面向对象
Feb 22 #PHP
php重定向的三种方法分享
Feb 22 #PHP
php中echo()和print()、require()和include()等易混淆函数的区别
Feb 22 #PHP
我的php学习笔记(毕业设计)
Feb 21 #PHP
PHP中运用jQuery的Ajax跨域调用实现代码
Feb 21 #PHP
修改PHP的memory_limit限制的方法分享
Feb 21 #PHP
You might like
论坛头像随机变换代码
2006/10/09 PHP
php中操作memcached缓存进行增删改查数据的实现代码
2014/08/15 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
2016/03/07 PHP
PHP页面输出时js设置input框的选中值
2016/09/30 PHP
PHP图像识别技术原理与实现
2016/10/27 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
javascript jQuery $.post $.ajax用法
2008/07/09 Javascript
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
Javascript浅谈之this
2013/12/17 Javascript
jquery 图片缩放拖动的简单实例
2014/01/08 Javascript
JavaScript中的继承方式详解
2015/02/11 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
浅谈JavaScript的自动垃圾收集机制
2016/12/15 Javascript
详解使用Vue Router导航钩子与Vuex来实现后退状态保存
2017/09/11 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
2019/11/07 Javascript
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
Python psutil模块简单使用实例
2015/04/28 Python
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
Python设置默认编码为utf8的方法
2016/07/01 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
Python yield生成器和return对比代码实例
2020/04/20 Python
全球虚拟主机商:HostGator
2017/02/06 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
学校领导班子对照检查材料
2014/08/28 职场文书
先进个人申报材料
2014/12/30 职场文书
2015年社区党务工作总结
2015/04/21 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
2016年学习雷锋精神广播稿
2015/12/17 职场文书
python爬取新闻门户网站的示例
2021/04/25 Python
Android存储中最基本的文件存储方式
2022/04/30 Java/Android
css弧边选项卡的项目实践
2023/05/07 HTML / CSS