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 Zip解压 文件在线解压缩的函数代码
May 26 PHP
php购物网站支付paypal使用方法
Nov 28 PHP
PHP的魔术常量__METHOD__简介
Jul 08 PHP
PHP+MySQL修改记录的方法
Jan 21 PHP
PHP用反撇号执行外部命令
Apr 14 PHP
php返回当前日期或者指定日期是周几
May 21 PHP
浅谈PHP中JSON数据操作
Jul 01 PHP
分享50个提高PHP执行效率的技巧
Dec 26 PHP
PHP中addcslashes与stripcslashes函数用法分析
Jan 07 PHP
Laravel网站打开速度优化的方法汇总
Jul 16 PHP
Laravel框架模板继承操作示例
Jun 11 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通用防注入程序 推荐
2011/02/26 PHP
php实现修改新闻时删除图片的方法
2015/05/12 PHP
php中Snoopy类用法实例
2015/06/19 PHP
php文件系统处理方法小结
2016/05/23 PHP
php gd等比例缩放压缩图片函数
2016/06/12 PHP
PHP的Json中文处理解决方案
2016/09/29 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
URL地址中的#符号使用说明
2011/02/12 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
JS回调函数 callback的理解与使用案例分析
2019/09/09 Javascript
微信JSSDK实现打开摄像头拍照再将相片保存到服务器
2019/11/15 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
vue使用exif获取图片经纬度的示例代码
2020/12/11 Vue.js
[03:46]显微镜下的DOTA2第七期——满血与残血
2014/06/20 DOTA
[02:31]2014DOTA2国际邀请赛2009专访:干爹表现出乎意料 看好DK杀回决赛
2014/07/20 DOTA
Python函数式编程指南(二):从函数开始
2015/06/24 Python
浅谈Python爬取网页的编码处理
2016/11/04 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
Python中asyncio模块的深入讲解
2019/06/10 Python
Django框架视图介绍与使用详解
2019/07/18 Python
python 发送json数据操作实例分析
2019/10/15 Python
Python操作Excel把数据分给sheet
2020/05/20 Python
如何使用 Flask 做一个评论系统
2020/11/27 Python
Python批量删除mysql中千万级大量数据的脚本分享
2020/12/03 Python
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
车间组长岗位职责
2013/12/20 职场文书
幼儿园教师教学反思
2014/02/06 职场文书
工商治理实习生的自我评价分享
2014/02/20 职场文书
学生安全责任书模板
2014/07/25 职场文书
四年级数学上册教学计划
2015/01/20 职场文书
华山导游词
2015/02/03 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
Go Grpc Gateway兼容HTTP协议文档自动生成网关
2022/06/16 Golang