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 相关文章推荐
配置支持SSI
Nov 25 PHP
请php正则走开
Mar 15 PHP
PHP之COOKIE支持详解
Sep 20 PHP
如何突破PHP程序员的技术瓶颈分析
Jul 17 PHP
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
Oct 03 PHP
PHP遍历数组的方法汇总
Apr 30 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
Sep 09 PHP
Netbeans 8.2与PHP相关的新特性介绍
Oct 08 PHP
php指定长度分割字符串str_split函数用法示例
Jan 30 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 PHP
什么是PHP7中的孤儿进程与僵尸进程
Apr 14 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
一个查看session内容的函数
2006/10/09 PHP
11个PHPer必须要了解的编程规范
2014/09/22 PHP
Nginx服务器上安装并配置PHPMyAdmin的教程
2015/08/18 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
JScript中的&quot;this&quot;关键字使用方式补充材料
2007/03/08 Javascript
Jquery AJAX 用于计算点击率(统计)
2010/06/30 Javascript
过虑特殊字符输入的js代码
2010/08/05 Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
2012/07/31 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
javascript实现随机读取数组的方法
2015/08/03 Javascript
angularjs学习笔记之简单介绍
2015/09/26 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
JavaScript登录验证码的实现
2016/10/27 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
vue 动态改变静态图片以及请求网络图片的实现方法
2018/02/07 Javascript
VUE重点问题总结
2018/03/19 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
解决vue 单文件组件中样式加载问题
2019/04/24 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
解决vue语法会有延迟加载显现{{xxx}}的问题
2019/11/14 Javascript
es6 for循环中let和var区别详解
2020/01/12 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
使用PM2+nginx部署python项目的方法示例
2018/11/07 Python
python3.x 生成3维随机数组实例
2019/11/28 Python
python os.listdir()乱码解决方案
2021/01/31 Python
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
Bootstrap File Input文件上传组件
2020/12/01 HTML / CSS
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
找工作最新求职信
2013/12/22 职场文书
4s店总经理岗位职责
2013/12/31 职场文书
微电影大赛策划方案
2014/06/05 职场文书
幼儿园教学反思范文
2016/03/02 职场文书