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 和 XML: 使用expat函数(一)
Oct 09 PHP
PHP下一个非常全面获取图象信息的函数
Nov 20 PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Jan 16 PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 PHP
PHP实现Soap通讯的方法
Nov 03 PHP
php实现用于验证所有类型的信用卡类
Mar 24 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
PHP中使用curl伪造IP的简单方法
Aug 07 PHP
WordPress中对访客评论功能的一些优化方法
Nov 24 PHP
WordPress中调试缩略图的相关PHP函数使用解析
Jan 07 PHP
php接口实现拖拽排序功能
Apr 23 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 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 分页类实现代码
2009/12/03 PHP
php设计模式 Proxy (代理模式)
2011/06/26 PHP
PHP批量检测并去除文件BOM头代码实例
2014/05/08 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
PHP中常用的输出函数总结
2014/09/22 PHP
php基础教程
2015/08/26 PHP
PHP判断一个数组是另一个数组子集的方法详解
2017/07/31 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
js 幻灯片的实现
2011/12/06 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
2017/04/11 jQuery
详解angularjs的数组传参方式的简单实现
2017/07/28 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
简单谈谈js的数据类型
2017/09/25 Javascript
JS实现左边列表移到到右边列表功能
2018/03/28 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
[06:36]吞吞映像top1
2014/06/20 DOTA
[02:10]2018DOTA2亚洲邀请赛赛前采访-Liquid
2018/04/03 DOTA
Python删除windows垃圾文件的方法
2015/07/14 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
python实现二分类的卡方分箱示例
2019/11/22 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
python中return如何写
2020/06/18 Python
详解CSS3的box-shadow属性制作边框阴影效果的方法
2016/05/10 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
StubHub澳大利亚:购买或出售您的门票
2019/08/01 全球购物
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
网络工程系信息安全技术专业大学生求职信
2013/10/22 职场文书
会计专业大学生职业生涯规划书
2014/02/11 职场文书
记账会计岗位职责
2014/06/16 职场文书
服务宗旨标语
2014/07/01 职场文书
作风整顿剖析材料
2014/09/30 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书