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 相关文章推荐
对squid中refresh_pattern的一些理解和建议
Apr 17 PHP
PHP var_dump遍历对象属性的函数与应用代码
Jun 04 PHP
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
Oct 19 PHP
PHP读取ACCESS数据到MYSQL的代码
May 11 PHP
PHP中基于ts与nts版本- vc6和vc9编译版本的区别详解
Apr 26 PHP
PHP内置过滤器FILTER使用实例
Jun 25 PHP
php中print(),print_r(),echo()的区别详解
Dec 01 PHP
php+ajax无刷新分页实例详解
Dec 07 PHP
Symfony2中被遗弃的getRequest()方法分析
Mar 17 PHP
PHP中的表达式简述
May 29 PHP
PHP new static 和 new self详解
Feb 19 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设计模式 Composite (组合模式)
2011/06/26 PHP
php编程实现获取excel文档内容的代码实例
2011/06/28 PHP
apache mysql php 源码编译使用方法
2012/05/03 PHP
学习php设计模式 php实现建造者模式
2015/12/07 PHP
PHP生成随机码的思路与方法实例探索
2019/04/11 PHP
FCK调用方法..
2006/12/21 Javascript
让iframe子窗体取父窗体地址栏参数(querystring)
2009/10/13 Javascript
jquery获取input表单值的代码
2010/04/19 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
jquery 学习之一 对象访问
2010/11/23 Javascript
纯JS实现根据CSS的class选择DOM
2014/03/22 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
javascript如何实现360度全景照片问题汇总
2016/04/04 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
基于JavaScript实现自定义滚动条
2017/01/25 Javascript
Vue服务端渲染和Vue浏览器端渲染的性能对比(实例PK )
2017/03/31 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
2019/04/17 Javascript
实用Javascript调试技巧分享(小结)
2019/06/18 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
[02:07]DOTA2新英雄展现中国元素,完美“圣典”亮相央视
2016/12/19 DOTA
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
python实现学生成绩测评系统
2020/06/22 Python
通过实例解析python and和or使用方法
2020/11/14 Python
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
意大利在线药房:shop-farmacia.it
2019/03/12 全球购物
DogBuddy荷兰:找到你最完美的狗保姆
2019/04/17 全球购物
文员的职业生涯规划发展方向
2014/02/08 职场文书
党委领导班子整改方案
2014/09/30 职场文书
教师工作能力自我评价
2015/03/04 职场文书
2015年大学生社会实践评语
2015/03/26 职场文书
地震捐款简报
2015/07/21 职场文书