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中使用gettext来支持多语言的方法
May 02 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 PHP
PHP的基本常识小结
Jul 05 PHP
php求正负数数组中连续元素最大值示例
Apr 11 PHP
PHP中substr()与explode()函数用法分析
Nov 24 PHP
php查询mysql数据库并将结果保存到数组的方法
Mar 18 PHP
ThinkPHP里用U方法调用js文件实例
Jun 18 PHP
在WordPress的文章编辑器中设置默认内容的方法
Dec 29 PHP
一个简单安全的PHP验证码类、PHP验证码
Sep 24 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
Nov 09 PHP
Laravel5.5以下版本中如何自定义日志行为详解
Aug 01 PHP
laravel 5.5 关闭token的3种实现方式
Oct 24 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 版本]
2007/03/20 PHP
PHP程序员面试 切忌急功近利(更需要注重以后的发展)
2010/09/01 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
php中动态变量用法实例
2015/06/10 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
详解PHP如何更好的利用PHPstorm的自动提示
2017/08/18 PHP
PHP xpath()函数讲解
2019/02/11 PHP
php数组指针函数功能及用法示例
2020/02/11 PHP
javascript字典探测用户名工具
2006/10/05 Javascript
关于文本限制字数的js代码
2007/04/02 Javascript
JavaScript Event学习补遗 addEventSimple
2010/02/11 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
js实现非常棒的弹出div
2016/10/06 Javascript
jQuery如何解决IE输入框不能输入的问题
2016/10/08 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
js设计模式之单例模式原理与用法详解
2019/08/15 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
Python 包含汉字的文件读写之每行末尾加上特定字符
2016/12/12 Python
Python合并字典键值并去除重复元素的实例
2016/12/18 Python
Python上下文管理器和with块详解
2017/09/09 Python
Python文件的读写和异常代码示例
2017/10/31 Python
Python中的引用知识点总结
2019/05/20 Python
python实现连连看辅助(图像识别)
2020/03/25 Python
pytorch 图像预处理之减去均值,除以方差的实例
2020/01/02 Python
python获取整个网页源码的方法
2020/08/03 Python
python爬取招聘要求等信息实例
2020/11/20 Python
移动端HTML5 input常见问题(小结)
2020/09/28 HTML / CSS
Vero Moda西班牙官方购物网站:丹麦BESTSELLER旗下知名女装品牌
2018/04/27 全球购物
Bonprix法国:时尚、鞋子、家居
2020/12/29 全球购物
关于感恩的演讲稿500字
2014/08/26 职场文书
交通安全横幅标语
2014/10/07 职场文书
2015年后备干部工作总结
2015/05/15 职场文书
一文读懂navicat for mysql基础知识
2021/05/31 MySQL