php设计模式 Observer(观察者模式)


Posted in PHP onJune 26, 2011
<?php 
/** 
* 观察者模式 
* 
* 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新 
* 能够便利地创建查看目标对象状态的对象,并且提供与核心对象非耦合的指定功能 
* 插件系统 
*/ 
class Observerable 
{ 
private $_observers = array(); public function registerObserver($observer) 
{ 
$this->_observers[] = $observer; 
} 
public function removeObserver($observer) 
{ 
$key = array_search($observer,$this->_observers); 
if(!($key === false)) 
{ 
unset($this->_observers[$key]); 
} 
} 
public function notifyObservers() 
{ 
foreach($this->_observers as $observer) 
{ 
if($observer instanceof Observer) $observer->update($this); 
} 
} 
} 
interface Observer 
{ 
public function update($observer); 
} 
interface DisplayElement 
{ 
public function display(); 
} 
// -- 实例类定义 
class NewsObserverable extends Observerable 
{ 
private $_sports_news; 
public function setSportsNews($data) 
{ 
$this->_sports_news = $data; 
$this->notifyObservers(); 
} 
public function getSportsNews() 
{ 
return $this->_sports_news; 
} 
private $_local_news; 
public function setLocalNews($data) 
{ 
$this->_local_news = $data; 
$this->notifyObservers(); 
} 
public function getLocalNews() 
{ 
return $this->_local_news; 
} 
} 
class SportsNews implements Observer,DisplayElement 
{ 
private $_data = null; 
public function update($observer) 
{ 
if($this->_data != $observer->getSportsNews()) 
{ 
$this->_data = $observer->getSportsNews(); 
$this->display(); 
} 
} 
public function display() 
{ 
echo $this->_data.date("Y-m-d H:i:s")."<br/>"; 
} 
} 
class LocalNews implements Observer,DisplayElement 
{ 
private $_data = null; 
public function update($observer) 
{ 
if($this->_data != $observer->getLocalNews()) 
{ 
$this->_data = $observer->getLocalNews(); 
$this->display(); 
} 
} 
public function display() 
{ 
echo $this->_data.date("Y-m-d H:i:s")."<br/>"; 
} 
} 
// -- 实例化 --- 
$objObserver = new NewsObserverable(); 
$local = new LocalNews(); 
$sports = new SportsNews(); 
$objObserver->registerObserver($local); 
$objObserver->registerObserver($sports); 
$objObserver->setSportsNews("sports news 1 "); 
$objObserver->setLocalNews("local news 1 "); 
$objObserver->removeObserver($sports); 
$objObserver->setLocalNews("local news 2 "); 
$objObserver->setSportsNews("sports news 2 "); 
$objObserver->removeObserver($local); 
$objObserver->setLocalNews("local news 3 ");
PHP 相关文章推荐
第六节 访问属性和方法 [6]
Oct 09 PHP
不错的一篇面向对象的PHP开发模式(简写版)
Mar 15 PHP
IP138 IP地址查询小偷实现代码
Feb 15 PHP
PHP STRING 陷阱原理说明
Jul 24 PHP
PHP高自定义性安全验证码代码
Nov 27 PHP
php开启与关闭错误提示适用于没有修改php.ini的权限
Oct 16 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
Dec 29 PHP
PHP文件上传处理案例分析
Oct 15 PHP
php原生导出excel文件的两种方法(推荐)
Nov 19 PHP
CodeIgniter框架验证码类库文件与用法示例
Mar 18 PHP
实例分析基于PHP微信网页获取用户信息
Nov 24 PHP
Laravel 实现密码重置功能
Feb 23 PHP
php设计模式 Singleton(单例模式)
Jun 26 #PHP
php设计模式 Command(命令模式)
Jun 26 #PHP
php设计模式 Template (模板模式)
Jun 26 #PHP
php设计模式 Proxy (代理模式)
Jun 26 #PHP
php设计模式 Composite (组合模式)
Jun 26 #PHP
php设计模式 State (状态模式)
Jun 26 #PHP
php设计模式 Bridge (桥接模式)
Jun 26 #PHP
You might like
PHP伪静态页面函数附使用方法
2008/06/20 PHP
PHP获取网址的顶级域名函数代码
2012/09/24 PHP
PHP中preg_match函数正则匹配的字符串长度问题
2015/05/27 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
jQuery .attr()和.removeAttr()方法操作元素属性示例
2013/07/16 Javascript
jquery弹出层类代码分享
2013/12/27 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
函数四种调用模式以及其中的this指向
2017/01/16 Javascript
ant design实现圈选功能
2019/12/17 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
jQuery实现评论模块
2020/08/19 jQuery
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
深入浅析ImageMagick命令执行漏洞
2016/10/11 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
用python实现百度翻译的示例代码
2018/03/09 Python
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
对Python3.6 IDLE常用快捷键介绍
2018/07/16 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
python两种注释用法的示例
2020/10/09 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
建筑专业毕业生自荐信
2014/05/25 职场文书
2015年高校教师个人工作总结
2015/05/25 职场文书
安全生产标语口号
2015/12/26 职场文书
一起来学习Python的元组和列表
2022/03/13 Python