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 相关文章推荐
PHP静态类
Nov 25 PHP
php下图片文字混合水印与缩略图实现代码
Dec 11 PHP
openflashchart 2.0 简单案例php版
May 21 PHP
php+highchats生成动态统计图
May 21 PHP
PHP常用的三种设计模式汇总
Aug 28 PHP
PHP实现的数独求解问题示例
Apr 18 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
Sep 01 PHP
php实现支付宝当面付(扫码支付)功能
May 30 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
May 08 PHP
使用Git实现Laravel项目的自动化部署
Nov 24 PHP
php计数排序算法的实现代码(附四个实例代码)
Mar 31 PHP
详解php反序列化
Jun 10 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
PHP新手上路(六)
2006/10/09 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
js和as的稳定传值问题解决
2013/07/14 Javascript
如何编写高质量JS代码
2014/12/28 Javascript
JavaScript获取元素尺寸和大小操作总结
2015/02/27 Javascript
基于javascript实现浏览器滚动条快到底部时自动加载数据
2015/11/30 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
2016/12/28 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
2017/01/03 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
vue-router命名视图的使用讲解
2019/01/19 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
JS PHP字符串截取函数实现原理解析
2020/08/29 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
python练习程序批量修改文件名
2014/01/16 Python
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
详解Python使用simplejson模块解析JSON的方法
2016/03/24 Python
Python编程之字符串模板(Template)用法实例分析
2017/07/22 Python
谈谈python中GUI的选择
2018/03/01 Python
python递归法解决棋盘分割问题
2019/07/17 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
python画图时设置分辨率和画布大小的实现(plt.figure())
2021/01/08 Python
css3实现的多级渐变下拉菜单导航效果代码
2015/08/31 HTML / CSS
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
全面解析HTML5中的标准属性与自定义属性
2016/02/18 HTML / CSS
标记环介质访问控制协议
2016/03/27 面试题
应届生服务员求职信
2013/10/31 职场文书
幼儿教师国培感言
2014/02/19 职场文书
青年文明号口号
2014/06/17 职场文书
机关作风建设整改方案
2014/10/27 职场文书
党校培训学习心得体会
2016/01/06 职场文书