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 相关文章推荐
类的另类用法--数据的封装
Oct 09 PHP
一步一步学习PHP(1) php开发环境配置
Feb 15 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
一漂亮的PHP图片验证码实例
Mar 21 PHP
php获取文件类型和文件信息的方法
Jul 10 PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
Oct 22 PHP
实现PHP搜索加分页
Oct 12 PHP
PHP编译configure时常见错误的总结
Aug 17 PHP
php微信开发之谷歌测距
Jun 14 PHP
Yii2.0框架模型多表关联查询示例
Jul 18 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
Aug 11 PHP
php判断IP地址是否在多个IP段内
Aug 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
PHP数据缓存技术
2007/02/14 PHP
PHP逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
新浪微博OAuth认证和储存的主要过程详解
2015/03/27 PHP
再Docker中架设完整的WordPress站点全攻略
2015/07/29 PHP
PHP预定义变量9大超全局数组用法详解
2016/04/23 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
PHP面向对象程序设计之多态性的应用示例
2018/12/19 PHP
javascript的事件描述
2006/09/08 Javascript
javascript动态加载三
2012/08/22 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
使用JQuery实现智能表单验证功能
2016/03/08 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
vue axios 简单封装以及思考
2018/10/09 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
2019/01/31 Javascript
小程序实现日历左右滑动效果
2019/10/21 Javascript
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
python进阶教程之异常处理
2014/08/30 Python
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
python机器学习之神经网络(一)
2017/12/20 Python
解决Django的request.POST获取不到内容的问题
2018/05/28 Python
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
django2.2安装错误最全的解决方案(小结)
2019/09/24 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
python线程池 ThreadPoolExecutor 的用法示例
2020/10/10 Python
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
国际贸易毕业生求职信范文
2014/02/21 职场文书
年终总结会主持词
2014/03/25 职场文书
软环境建设心得体会
2014/09/09 职场文书
大学本科生职业生涯规划书范文
2014/09/14 职场文书