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 相关文章推荐
PHPEXCEL 使用小记
Jan 06 PHP
如何用php生成扭曲及旋转的验证码图片
Jun 07 PHP
提高PHP编程效率的方法
Nov 07 PHP
php学习笔记之面向对象
Nov 08 PHP
php从字符串创建函数的方法
Mar 16 PHP
PHP CURL 多线程操作代码实例
May 13 PHP
mac下多个php版本快速切换的方法
Oct 09 PHP
php使用crypt()函数进行加密
Jun 08 PHP
阿里云PHP SMS短信服务验证码发送方法
Jul 11 PHP
关于php支持的协议与封装协议总结(推荐)
Nov 17 PHP
PHP INT类型在内存中占字节详解
Jul 20 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
Feb 07 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自动适应范围的分页代码
2008/08/05 PHP
Opacity.js
2007/01/22 Javascript
js类中的公有变量和私有变量
2008/07/24 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
jquery动态添加删除(tr/td)
2015/02/09 Javascript
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
react-native-tab-navigator组件的基本使用示例代码
2017/09/07 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
不得不知的ES6小技巧
2018/07/28 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
微信小程序传值以及获取值方法的详解
2019/04/29 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
vue中input的v-model清空操作
2019/09/06 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
python进阶教程之循环对象
2014/08/30 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
Python容器使用的5个技巧和2个误区总结
2019/09/26 Python
tensorflow 环境变量设置方式
2020/02/06 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
css3的transform中scale缩放详解
2014/12/08 HTML / CSS
HTML5实现视频直播功能思路详解
2017/11/16 HTML / CSS
vue路由实现登录拦截
2021/03/24 Vue.js
初中同学聚会感言
2014/02/11 职场文书
《乞巧》教学反思
2014/02/27 职场文书
法人委托书范本格式
2014/09/15 职场文书
谢师宴答谢词
2015/01/05 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
永中文档在线转换预览基于nginx配置部署方案
2022/06/10 Servers