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下打开URL地址的几种方法小结
May 16 PHP
深入php之规范编程命名小结
May 15 PHP
php中通过数组进行高效随机抽取指定条记录的算法
Sep 09 PHP
PHP类继承 extends使用介绍
Jan 14 PHP
在Nginx上部署ThinkPHP项目教程
Feb 02 PHP
php中判断数组相等的方法以及数组运算符介绍
Mar 30 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
PHP创建word文档的方法(平台无关)
Mar 29 PHP
php中让人头疼的浮点数运算分析
Oct 10 PHP
PHP实践教程之过滤、验证、转义与密码详解
Jul 24 PHP
phpStudy 2016 使用教程详解(支持PHP7)
Oct 18 PHP
使用composer命令加载vendor中的第三方类库 的方法
Jul 09 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
给初学PHP的5个入手程序
2006/11/23 PHP
PHP 防恶意刷新实现代码
2010/05/16 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
php实现水仙花数示例分享
2014/04/03 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
2019/09/08 PHP
JS模拟多线程
2007/02/07 Javascript
YUI 读码日记之 YAHOO.util.Dom - Part.1
2008/03/22 Javascript
JavaScript 获取用户客户端操作系统版本
2009/08/25 Javascript
jquery异步循环获取功能实现代码
2010/09/19 Javascript
js的alert弹出框出现乱码解决方案
2013/09/02 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
微信小程序 window_x64环境搭建
2016/09/30 Javascript
jQuery编写设置和获取颜色的插件
2017/01/09 Javascript
浅谈实现vue2.0响应式的基本思路
2018/02/13 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
解决vue admin element noCache设置无效的问题
2019/11/12 Javascript
JavaScript实现鼠标经过表格某行时此行变色
2020/11/20 Javascript
Vue3 实现双盒子定位Overlay的示例
2020/12/22 Vue.js
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
python中字符串前面加r的作用
2015/06/04 Python
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
Python实现账号密码输错三次即锁定功能简单示例
2019/03/29 Python
python hashlib加密实现代码
2019/10/17 Python
什么是python的函数体
2020/06/19 Python
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
idealfit英国:世界领先的女性健身用品和运动衣物品牌
2017/11/25 全球购物
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
安全生产月演讲稿
2014/05/09 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
中考学习决心书
2015/02/04 职场文书
2015年光棍节活动总结
2015/03/24 职场文书
英文自荐信范文
2015/03/25 职场文书
Python面向对象之成员相关知识总结
2021/06/24 Python
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL