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 相关文章推荐
PHP实现的功能是显示8条基色色带
Oct 09 PHP
关于文本留言本的分页代码
Oct 09 PHP
php cookis创建实现代码
Mar 16 PHP
浅析PHP原理之变量分离/引用(Variables Separation)
Aug 09 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
Sep 22 PHP
yii操作cookie实例简介
Jul 09 PHP
PHP开发注意事项总结
Feb 04 PHP
thinkPHP下ueditor的使用方法详解
Dec 26 PHP
PHP正则表达式过滤html标签属性(DEMO)
May 04 PHP
php中mkdir()函数的权限问题分析
Sep 24 PHP
php微信公众号开发之关键词回复
Oct 20 PHP
laravel 解决路由除了根目录其他都404的问题
Oct 18 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
SONY SRF-22W(33W)的电路分析和维修案例
2021/03/02 无线电
基于php常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
2016/04/11 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
js 判断计算字符串长度/判断空的简单方法
2013/08/05 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
JavaScript跨域调用基于JSON的RESTful API
2016/07/09 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
Vue 滚动行为的具体使用方法
2017/09/13 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
python运行时间的几种方法
2016/06/17 Python
用Python解决计数原理问题的方法
2016/08/04 Python
python导出hive数据表的schema实例代码
2018/01/22 Python
Pycharm最常用的快捷键及使用技巧
2020/03/05 Python
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
一个基于canvas的移动端图片编辑器的实现
2020/10/28 HTML / CSS
AC Lens:购买隐形眼镜
2017/02/26 全球购物
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
销售业务实习自我鉴定
2013/09/23 职场文书
幼儿园大班毕业感言
2014/02/06 职场文书
社区禁毒工作方案
2014/06/02 职场文书
工作证明格式及范本
2014/09/12 职场文书
2014年工作总结及2015工作计划
2014/12/12 职场文书
清洁工岗位职责
2015/02/13 职场文书
邮政营业员岗位职责
2015/04/14 职场文书
上课迟到检讨书范文
2015/05/06 职场文书
陪护人员误工证明
2015/06/24 职场文书
运动会宣传稿100字
2015/07/23 职场文书
2016清明节森林防火广播稿
2015/12/17 职场文书
python 三边测量定位的实现代码
2021/04/22 Python
用python开发一款操作MySQL的小工具
2021/05/12 Python