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来自动调用不同服务器上的flash
Oct 09 PHP
杏林同学录(一)
Oct 09 PHP
编写漂亮的代码 - 将后台程序与前端程序分开
Apr 23 PHP
PHP 配置文件中open_basedir选项作用
Jul 19 PHP
php设计模式 Adapter(适配器模式)
Jun 26 PHP
php入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
Jul 14 PHP
PHP中array_slice函数用法实例详解
Nov 25 PHP
php生成不重复随机数、数组的4种方法分享
Mar 30 PHP
支持中文的PHP按字符串长度分割成数组代码
May 17 PHP
php微信公众平台配置接口开发程序
Sep 22 PHP
PHP的curl函数的用法总结
Feb 14 PHP
详解PHP 7.4 中数组延展操作符语法知识点
Jul 19 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/10/20 PHP
php实现网站插件机制的方法
2009/11/10 PHP
详解PHP处理密码的几种方式
2016/11/30 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
javascript 对象的定义方法
2007/01/10 Javascript
用JavaScript将从数据库中读取出来的日期型格式化为想要的类型。
2009/08/15 Javascript
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
简略的前端架构心得&amp;&amp;基于editor为例子的编码小技巧
2010/11/25 Javascript
Document:getElementsByName()使用方法及示例
2013/10/28 Javascript
JQuery跳出each循环的方法
2015/04/16 Javascript
浅析在javascript中创建对象的各种模式
2016/05/06 Javascript
JS及JQuery对Html内容编码,Html转义
2017/02/17 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
2020/06/04 Javascript
[01:12:08]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.24
2019/09/10 DOTA
Python中列表(list)操作方法汇总
2014/08/18 Python
python编程线性回归代码示例
2017/12/07 Python
python执行CMD指令,并获取返回的方法
2018/12/19 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
python Paramiko使用示例
2020/09/21 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
2021/01/06 Python
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
比较基础的php面试题及答案-编程题
2012/10/14 面试题
护理学毕业生求职信
2013/11/14 职场文书
幼儿园教师请假制度
2014/01/16 职场文书
小学安全汇报材料
2014/08/14 职场文书
春秋淹城导游词
2015/02/11 职场文书
周一问候语大全
2015/11/10 职场文书
python glom模块的使用简介
2021/04/13 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
2021/05/28 Python
浅析Python OpenCV三种滤镜效果
2022/04/11 Python