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中Cannot send session cache limiter 的问题的方法
Apr 27 PHP
php 什么是PEAR?
Mar 19 PHP
php array_unique之后json_encode需要注意
Jan 02 PHP
PHP句法规则详解 入门学习
Nov 09 PHP
Destoon模板制作简明教程
Jun 20 PHP
php实现俄罗斯乘法实例
Mar 07 PHP
PHP中使用Memache作为进程锁的操作类分享
Mar 30 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
Jun 06 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
May 09 PHP
laravel中短信发送验证码的实现方法
Apr 25 PHP
PHP常用函数之根据生日计算年龄功能示例
Oct 21 PHP
PHP dirname简单使用代码实例
Nov 13 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.MVC的模板标签系统(四)
2006/09/05 PHP
PHP实现在线阅读PDF文件的方法
2015/06/17 PHP
PHP 文件上传后端处理实用技巧方法
2017/01/06 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
javascript function、指针及内置对象
2009/02/19 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
Bootstrap Table服务器分页与在线编辑应用总结
2016/08/08 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
2017/12/09 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
Python3爬楼梯算法示例
2019/03/04 Python
Django中F函数的使用示例代码详解
2020/07/06 Python
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
师范生个人推荐信
2013/11/29 职场文书
专营店会计助理岗位职责
2013/11/29 职场文书
医学专业职业生涯规划范文
2014/02/05 职场文书
法人委托书范本
2014/04/04 职场文书
营销与策划专业求职信
2014/06/20 职场文书
关于倡议书的范文
2015/04/29 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
初一语文教学反思
2016/03/03 职场文书
公开致歉信
2019/06/24 职场文书
利用python做表格数据处理
2021/04/13 Python