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数据库连接
Oct 09 PHP
php 获取mysql数据库信息代码
Mar 12 PHP
基于php实现长连接的方法与注意事项的问题
May 10 PHP
php遍历文件夹所有文件子文件夹函数代码
Nov 27 PHP
YII模块实现绑定二级域名的方法
Jul 09 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
Jan 13 PHP
ucenter中词语过滤原理分析
Jul 13 PHP
WAF的正确bypass
Jan 05 PHP
php 调用百度sms来发送短信的实现示例
Nov 02 PHP
PHP与SQL语句写一句话木马总结
Oct 11 PHP
ThinkPHP 5.1 跨域配置方法
Oct 11 PHP
php优化查询foreach代码实例讲解
Mar 24 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设置图片文件上传大小的具体实现方法
2013/10/11 PHP
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
jQuery的几个我们必须了解的特点
2015/05/03 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
2016/08/16 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
2017/01/18 Javascript
js中数组插入、删除元素操作的方法
2017/02/15 Javascript
BootStrap与Select2使用小结
2017/02/17 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
JavaScript中Object基础内部方法图
2018/02/05 Javascript
详解Vue.js iview实现树形权限表(可扩展表)
2018/09/30 Javascript
JQuery实现简单的复选框树形结构图示例【附源码下载】
2019/07/16 jQuery
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
tornado框架blog模块分析与使用
2013/11/21 Python
python2.7删除文件夹和删除文件代码实例
2013/12/18 Python
Python 读取用户指令和格式化打印实现解析
2019/09/02 Python
pygame实现打字游戏
2021/02/19 Python
Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释
2020/01/25 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
2020/06/02 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
英国婚礼商城:Wedding Mall
2019/11/02 全球购物
介绍一下Java的安全机制
2012/06/28 面试题
精彩的大学生自我评价
2013/11/17 职场文书
饮料业务员岗位职责
2013/12/15 职场文书
建议书的格式
2014/05/12 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
庆六一活动总结
2014/08/29 职场文书
大学毕业典礼演讲稿
2014/09/09 职场文书
2015员工年度考核评语
2015/03/25 职场文书
惊天动地观后感
2015/06/10 职场文书
小学数学教学反思范文
2016/02/16 职场文书
浅谈Redis 中的过期删除策略和内存淘汰机制
2022/04/03 Redis