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 信息采集程序代码
Mar 17 PHP
PHP判断远程url是否有效的几种方法小结
Oct 08 PHP
PHP--用万网的接口实现域名查询功能
Dec 13 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
Jan 09 PHP
PHP代码优化之成员变量获取速度对比
Feb 28 PHP
PHP实现设计模式中的抽象工厂模式详解
Oct 11 PHP
PHP随机生成信用卡卡号的方法
Mar 23 PHP
php.ini中的request_order推荐设置
May 10 PHP
对php 判断http还是https,以及获得当前url的方法详解
Jan 15 PHP
关于laravel框架中的常用目录路径函数
Oct 23 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
Jan 26 PHP
php实现简易计算器
Aug 28 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入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
2017/08/28 PHP
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
30个精美的jQuery幻灯片效果插件和教程
2011/08/23 Javascript
JSONP 跨域访问代理API-yahooapis实现代码
2012/12/02 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
判断访客终端类型集锦
2015/06/05 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
使用Vue.js和Flask来构建一个单页的App的示例
2018/03/21 Javascript
详解关于vue-area-linkage走过的坑
2018/06/27 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
2019/05/14 Javascript
python自定义解析简单xml格式文件的方法
2015/05/11 Python
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
Python解惑之整数比较详解
2017/04/24 Python
python实现逻辑回归的方法示例
2017/05/02 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
python使用tomorrow实现多线程的例子
2019/07/20 Python
学习和使用python的13个理由
2019/07/30 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
CSS3制作文字半透明倒影效果的两种实现方式
2014/08/08 HTML / CSS
结合CSS3的布局新特征谈谈常见布局方法
2016/01/22 HTML / CSS
规范化管理年活动总结
2014/08/29 职场文书
七一讲话心得体会
2014/09/05 职场文书
四风自我剖析材料思想汇报
2014/10/01 职场文书
房屋转让协议书
2014/10/18 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
2014年节能降耗工作总结
2014/12/11 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
Python实现byte转integer
2021/06/03 Python
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB
请求模块urllib之PYTHON爬虫的基本使用
2022/04/08 Python
Redis全局ID生成器的实现
2022/06/05 Redis