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 相关文章推荐
基于文本的访客签到簿
Oct 09 PHP
PHP 编程安全性小结
Jan 08 PHP
30 个很棒的PHP开源CMS内容管理系统小结
Oct 14 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
Nov 27 PHP
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
Nov 26 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
Jun 19 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
Sep 24 PHP
PHP实现图片裁剪、添加水印效果代码
Oct 01 PHP
浅谈PHP解析URL函数parse_url和parse_str
Nov 11 PHP
使用PHP生成PDF方法详解
Jan 23 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
May 12 PHP
php使用正则表达式去掉html中的注释方法
Nov 03 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
第十五节--Zend引擎的发展
2006/11/16 PHP
支持汉转拼和拼音分词的PHP中文工具类ChineseUtil
2018/02/23 PHP
PHP实现负载均衡下的session共用功能
2018/04/17 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
PHP call_user_func和call_user_func_array函数的简单理解与应用分析
2019/11/25 PHP
JQuery中的ready函数冲突的解决方法
2010/05/17 Javascript
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
基于jQuery判断两个元素是否有重叠部分的代码
2012/07/25 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
JavaScript操作Oracle数据库示例
2015/03/06 Javascript
JS组件Bootstrap实现图片轮播效果
2016/05/16 Javascript
jQuery获取复选框选中的当前行的某个字段的值
2017/09/15 jQuery
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
微信小程序中显示倒计时代码实例
2019/05/09 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
django模型中的字段和model名显示为中文小技巧分享
2014/11/18 Python
使用tkinter实现三子棋游戏
2021/02/25 Python
让ie浏览器成为支持html5的浏览器的解决方法(使用html5shiv)
2014/04/08 HTML / CSS
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
博朗(Braun)俄罗斯官方商店:德国小家电品牌
2019/09/24 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
会议邀请书范文
2014/02/02 职场文书
计算机科学系职业生涯规划书
2014/03/08 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
婚前财产公证书
2014/04/10 职场文书
西岭雪山导游词
2015/02/06 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
《山中访友》教学反思
2016/02/24 职场文书
python中if和elif的区别介绍
2021/11/07 Python
Python OpenCV超详细讲解读取图像视频和网络摄像头
2022/04/02 Python