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初学入门
Nov 19 PHP
PHP访问MYSQL数据库封装类(附函数说明)
Dec 04 PHP
php学习之 数组声明
Jun 09 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
Jul 02 PHP
php中判断数组是一维,二维,还是多维的解决方法
May 04 PHP
php实现的zip文件内容比较类
Sep 24 PHP
Yii把CGridView文本框换成下拉框的方法
Dec 03 PHP
Java和PHP在Web开发方面对比分析
Mar 01 PHP
codeigniter中实现一次性加载多个view的方法
Mar 20 PHP
实现PHP框架系列文章(6)mysql数据库方法
Mar 04 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 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
PHILIPS AE3805收音机的分析打磨
2021/03/02 无线电
PHP使用Mysql事务实例解析
2014/09/08 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
JavaScript 动态创建VML的方法
2009/10/14 Javascript
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
jquery 页面滚动到指定DIV实现代码
2013/09/25 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
jQuery实现带延时功能的水平多级菜单效果【附demo源码下载】
2016/09/21 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
基于easyui checkbox 的一些操作处理方法
2017/07/10 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
HTML5学习心得总结(推荐)
2016/07/08 HTML / CSS
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
美国校园市场:OCM
2017/06/08 全球购物
来自世界上最好大学的在线课程:edX
2018/10/16 全球购物
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
中专生求职自荐信范文
2013/12/22 职场文书
2014年小学英语教师工作总
2014/12/03 职场文书
2015年社区工作总结
2015/04/08 职场文书
运动会1000米加油稿
2015/07/21 职场文书
员工担保书范本
2015/09/22 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
假如给我三天光明:舟逆水而行,人遇挫而达 
2019/10/29 职场文书
HTTP中的Content-type详解
2022/01/18 HTML / CSS
Golang原生rpc(rpc服务端源码解读)
2022/04/07 Golang
Python matplotlib多个子图绘制整合
2022/04/13 Python