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 ajax 分页类代码
Nov 13 PHP
解析strtr函数的效率问题
Jun 26 PHP
解析array splice的移除数组中指定键的值,返回一个新的数组
Jul 02 PHP
php中rename函数用法分析
Nov 15 PHP
php操作(删除,提取,增加)zip文件方法详解
Mar 12 PHP
php将远程图片保存到本地服务器的实现代码
Aug 03 PHP
PHP MySql增删改查的简单实例
Jun 21 PHP
浅谈PHP发送HTTP请求的几种方式
Jul 25 PHP
基于php流程控制语句和循环控制语句(讲解)
Oct 23 PHP
PHP Class SoapClient not found解决方法
Jan 20 PHP
php实现微信企业转账功能
Oct 02 PHP
Laravel5.3+框架定义API路径取消CSRF保护方法详解
Apr 06 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 数据库树的遍历方法
2009/02/06 PHP
PHP CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
2012/01/16 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
2013/06/21 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
PHP的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
PHP mkdir()无写权限的问题解决方法
2014/06/19 PHP
PHPMailer发送HTML内容、带附件的邮件实例
2014/07/01 PHP
thinkphp中session和cookie无效的解决方法
2014/12/19 PHP
PHP使用DirectoryIterator显示下拉文件列表的方法
2015/03/13 PHP
PHP设计模式之观察者模式定义与用法分析
2019/04/04 PHP
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
JQuery onload、ready概念介绍及使用方法
2013/04/27 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
ajax的分页查询示例(不刷新页面)
2017/01/11 Javascript
js date 格式化
2017/02/15 Javascript
jQuery实现QQ空间汉字转拼音功能示例
2017/07/10 jQuery
NW.js 简介与使用方法
2018/02/01 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
vue 限制input只能输入正数的操作
2020/08/05 Javascript
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
Python标准库与第三方库详解
2014/07/22 Python
使用Python的toolz库开始函数式编程的方法
2018/11/15 Python
Python函数中不定长参数的写法
2019/02/13 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
意大利领先的线上奢侈品销售电商:Eleonora Bonucci
2017/10/17 全球购物
UNIONBAY官网:美国青少年服装品牌
2019/03/26 全球购物
土木工程师岗位职责
2013/11/24 职场文书
四年的大学生生活自我评价
2013/12/09 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
python基础入门之普通操作与函数(三)
2021/06/13 Python