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生成SessionID和图片校验码的思路和实现代码
Mar 10 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
Nov 10 PHP
IIS安装Apache伪静态插件的具体操作图文
Jul 01 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十一)
Jun 25 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
Apr 20 PHP
php中使用gd库实现远程图片下载实例
May 12 PHP
CentOS下PHP7的编译安装及MySQL的支持和一些常见问题的解决办法
Dec 17 PHP
PHP导出Excel实例讲解
Jan 24 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
PHP实现的大文件切割与合并功能示例
Apr 10 PHP
thinkPHP实现基于ajax的评论回复功能
Jun 22 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
使用网络地址转换实现多服务器负载均衡
2006/10/09 PHP
一些常用的php函数
2006/12/06 PHP
sql注入与转义的php函数代码
2013/06/17 PHP
PHP加密解密字符串汇总
2015/04/26 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
IE6中使用position导致页面变形的解决方案(js代码)
2011/01/09 Javascript
jquery实现手风琴效果实例代码
2013/11/15 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
JS实现带鼠标效果的头像及文章列表代码
2015/09/27 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
学习Angularjs分页指令
2016/07/01 Javascript
JavaScript数组_动力节点Java学院整理
2017/06/26 Javascript
vue.js框架实现表单排序和分页效果
2017/08/09 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
详解vue-router传参的两种方式
2018/09/10 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
深入理解javascript prototype的相关知识
2019/09/19 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
vue-resource 拦截器interceptors使用详解
2021/01/18 Vue.js
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
JSON Web Tokens的实现原理
2017/04/02 Python
解决Python的str强转int时遇到的问题
2018/04/09 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
Python grpc超时机制代码示例
2020/09/14 Python
html5在移动端的屏幕适应问题示例探讨
2014/06/15 HTML / CSS
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
世界第一曲奇连锁店:Mrs. Fields Cookies
2017/02/04 全球购物
Book Depository欧盟:一家领先的国际图书零售商
2019/05/21 全球购物
施华洛世奇西班牙官网:SWAROVSKI西班牙
2019/06/06 全球购物
班组长安全工作职责
2014/07/15 职场文书
爱祖国爱家乡演讲稿
2014/09/02 职场文书
钓鱼岛事件感想
2015/08/11 职场文书