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 相关文章推荐
第十节 抽象方法和抽象类 [10]
Oct 09 PHP
php在字符串中查找另一个字符串
Nov 19 PHP
PHP 强制性文件下载功能的函数代码(任意文件格式)
May 26 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
Jan 20 PHP
配置php网页显示各种语法错误
Sep 23 PHP
php数组保存文本与文本反编成数组实例
Nov 13 PHP
Symfony页面的基本创建实例详解
Jan 26 PHP
php使用cookie实现记住用户名和密码实现代码
Apr 27 PHP
php die()与exit()的区别实例详解
Dec 03 PHP
PHP实现的数据对象映射模式详解
Mar 20 PHP
Yii框架的路由配置方法分析
Sep 09 PHP
解决tp5在nginx下修改配置访问的问题
Oct 16 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中explode与split的区别介绍
2012/10/03 PHP
PHP获取文件行数的方法
2015/06/10 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
基于laravel缓冲cache的用法详解
2019/10/23 PHP
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
js实现仿百度汽车频道选择汽车图片展示实例
2015/05/06 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
微信小程序 wxapp内容组件 icon详细介绍
2016/10/31 Javascript
详解jQuery的Cookie插件
2016/11/23 Javascript
js实现右键菜单功能
2016/11/28 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
Python科学画图代码分享
2017/11/29 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
python3使用smtplib实现发送邮件功能
2018/05/22 Python
Python Requests库基本用法示例
2018/08/20 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
浅谈PyTorch中in-place operation的含义
2020/06/27 Python
Python经纬度坐标转换为距离及角度的实现
2020/11/01 Python
python中PyQuery库用法分享
2021/01/15 Python
html5 css3实例教程 一款html5和css3实现的小机器人走路动画
2014/10/20 HTML / CSS
阿玛尼意大利官网:Armani意大利
2018/10/30 全球购物
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
爱与责任演讲稿
2014/05/20 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
检讨书范文
2015/01/27 职场文书
苏州园林导游词
2015/02/03 职场文书
2015年仓库管理员工作总结
2015/04/21 职场文书
实习单位意见
2015/06/04 职场文书
基于Nginx实现限制某IP短时间访问次数
2021/03/31 Servers
python实现MD5进行文件去重的示例代码
2021/07/09 Python
Python中的tkinter库简单案例详解
2022/01/22 Python
go goth封装第三方认证库示例详解
2022/08/14 Golang