php设计模式之观察者模式的应用详解


Posted in PHP onMay 21, 2013

观察者模式:定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
观察者类:
1.抽象主题角色:主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以任意多个观察者。抽象主题提供了增加和删除观察者对象的接口。
2.抽象观察者角色:为所有的具体观察者定义一个接口,在观察的主题发生改变时更新自己
3.具体主题角色:存储相关状态到具体观察者对象,当具体主题的内部状态发生改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。
4.具体观察者角色:存储一个具体主题对象,存储相关状态,实现抽象观察者角色所要求的更新接口,以使得其自身状态和主题的状态保持一致
作用:
1. 观察者模式的耦合度较小
2.支持广播通信

<?php
//抽象主题
interface Subject{
     public function attach($observer);
     public function detach($observer);
     public function notifyObservers();
}
//具体主题
class ConcreateSubject implements Subject{
     private $_observers;
     public function __construct(){
          $this->_observers = array();
     }     public function attach($observer){
          return array_push($this->_observers,$observer);
     }
     public function detach($observer){
          $index = array_search($observer,$this->_observers);
          if($index === false || !array_key_exists($index,$this->_observers)){
               return false;
          }
          unset($this->_observer[$index]);
          return true;
     }
     public function notifyObservers(){
          if(!is_array($this->_observers)){
               return false;
          }
          foreach($this->_observers as $observer){
               $observer->update();
          }
          return true;
     }
}
//抽象观察者
interface Observer{
     public function update();
}
//具体观察者
class ConcreteObserver implement Observer{
     private $_name;
     public function __construct($name){
          $this->_name = $name;
     }
     public function update(){
          echo 'Observer',$this->_name.'has notified<br/>';
     }
}
//客户端
class Client{
     public static function main(){
            $subject = new ConcreteSubject();
            //新增第一个观察者
            $observer1 = new ConcreteObserver('Martin');
            $subject->attach($observer1);
            //通知
            $subject->notifyObservers();
            //新增第二个观察者
            $observer2 = new ConcreteObserver('jaky');
            $subject->attach($observer2);
            //通知
            $subject->notifyObservers();
            //删除观察者1
            $subject->deatch($observer1);
            //通知
            $subject->notifyObservers();
     }
}
Client::main();
?>
PHP 相关文章推荐
php后台程序与Javascript的两种交互方式
Oct 25 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
May 06 PHP
探讨PHP中OO之静态关键字以及类常量的详解
Jun 07 PHP
探讨如何在php168_cms中提取验证码
Jun 08 PHP
使用php伪造referer的方法 利用referer防止图片盗链
Jan 20 PHP
PHP内存缓存Memcached类实例
Dec 08 PHP
完美解决thinkphp验证码出错无法显示的方法
Dec 09 PHP
php超快高效率统计大文件行数
Jul 05 PHP
weiphp微信公众平台授权设置
Jan 04 PHP
php 修改上传文件大小限制实例详解
Oct 23 PHP
PHP中empty,isset,is_null用法和区别
Feb 19 PHP
PHP实现数组根据某个单元字段排序操作示例
Aug 01 PHP
php设计模式之命令模式的应用详解
May 21 #PHP
浅谈PHP与C#的值类型指向区别的详解
May 21 #PHP
PHP无法访问远程mysql的问题分析及解决
May 16 #PHP
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
May 15 #PHP
解析dedecms空间迁移步骤详解
May 15 #PHP
基于php缓存的详解
May 15 #PHP
解析php中mysql_connect与mysql_pconncet的区别详解
May 15 #PHP
You might like
php学习之 认清变量的作用范围
2010/01/26 PHP
zen cart新进商品的随机排序修改方法
2010/09/10 PHP
phpexcel导出excel的颜色和网页中的颜色显示不一致
2012/12/11 PHP
thinkphp使用phpmailer发送邮件的方法
2014/11/24 PHP
php绘制一条弧线的方法
2015/01/24 PHP
PHP图像处理类库及演示分享
2015/05/17 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
php 指定范围内多个随机数代码实例
2016/07/18 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
2017/02/04 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
Javascript MD4
2006/12/20 Javascript
JavaScript 学习 - 提高篇
2007/02/02 Javascript
动态样式类封装JS代码
2009/09/02 Javascript
Javascript 匿名函数及其代码模式原理
2010/03/19 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
如何将php数组或者对象传递给javascript
2014/03/20 Javascript
jQuery实现菜单式图片滑动切换
2015/03/14 Javascript
JavaScript String 对象常用方法详解
2016/05/13 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
Node.js开发第三方微信公众平台
2017/06/05 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
jQuery表单选择器用法详解
2019/08/22 jQuery
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
Python pandas实现excel工作表合并功能详解
2019/08/29 Python
python global关键字的用法详解
2019/09/05 Python
解决Jupyter因卸载重装导致的问题修复
2020/04/10 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
大学生军训自我鉴定范文
2014/09/18 职场文书
2015年学校心理健康教育工作总结
2015/05/11 职场文书
党员电教片《信仰》心得体会
2016/01/15 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
深入浅析Redis 集群伸缩原理
2021/05/15 Redis