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 相关文章推荐
一个查看session内容的函数
Oct 09 PHP
如何对PHP程序中的常见漏洞进行攻击(下)
Oct 09 PHP
php公用函数列表[正则]
Feb 22 PHP
PHP insert语法详解
Jun 07 PHP
php生成缩略图的类代码
Oct 02 PHP
Windows IIS PHP 5.2 安装与配置方法
Jun 08 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
Jan 27 PHP
ThinkPHP 防止表单重复提交的方法
Aug 08 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
Jun 13 PHP
php 常用算法和时间复杂度
Jul 01 PHP
php采集内容中带有图片地址的远程图片并保存的方法
Jan 03 PHP
再谈PHP中单双引号的区别详解
Jun 12 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
thinkPHP+ajax实现统计页面pv浏览量的方法
2017/03/15 PHP
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
js 图片轮播(5张图片)
2008/12/30 Javascript
Javascript继承机制的设计思想分享
2011/08/28 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
浅析JavaScript回调函数应用
2016/05/22 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
angular之ng-template模板加载
2017/11/09 Javascript
Vue header组件开发详解
2018/01/26 Javascript
vue非父子组件通信问题及解决方法
2018/06/11 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
[01:31]DOTA2上海特级锦标赛 SECRET战队完整宣传片
2016/03/16 DOTA
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
2020/02/05 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
2020/04/24 Python
Python无损压缩图片的示例代码
2020/08/06 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
如何通过 CSS 写出火焰效果
2021/03/24 HTML / CSS
学习委员自我鉴定
2014/01/13 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
会计毕业生自荐书
2014/06/12 职场文书
遗失说明具结保证书
2015/02/26 职场文书
博士导师推荐信
2015/03/25 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
黑白记忆观后感
2015/06/18 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
导游词之云南丽江古城
2019/09/17 职场文书
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技