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 文章中的远程图片采集到本地的代码
Jul 30 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
Apr 18 PHP
php中http_build_query 的一个问题
Mar 25 PHP
php实现的DateDiff和DateAdd时间函数代码分享
Aug 16 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
Feb 27 PHP
WordPress分页伪静态加html后缀
Jun 08 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
Nov 14 PHP
对于Laravel 5.5核心架构的深入理解
Feb 22 PHP
PHP Trait代码复用类与多继承实现方法详解
Jun 17 PHP
Laravel重定向,a链接跳转,控制器跳转示例
Oct 22 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
Apr 04 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文件扩展名判断及获取文件扩展名的N种方法
2015/09/12 PHP
[原创]图片分页查看
2006/08/28 Javascript
锋利的jQuery 要点归纳(二) jQuery中的DOM操作(下)
2010/03/23 Javascript
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
JS中 用户登录系统的解决办法
2013/04/15 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
jquery datepicker参数介绍和示例
2014/04/15 Javascript
JavaScript中的函数声明和函数表达式区别浅析
2015/03/27 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
极易被忽视的javascript面试题七问七答
2016/02/15 Javascript
AngularJS 自定义过滤器详解及实例代码
2016/09/14 Javascript
bootstrap table实例详解
2017/01/06 Javascript
深入学习 JavaScript中的函数调用
2017/03/23 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
vue-cli构建项目使用 less的方法
2017/10/04 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
2018/09/30 Javascript
js实现每日签到功能
2018/11/29 Javascript
JavaScript错误处理操作实例详解
2019/01/04 Javascript
JavaScript 替换所有匹配内容及正则替换方法
2020/02/12 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
浅谈vue中$bus的使用和涉及到的问题
2020/07/28 Javascript
js获取图片的base64编码并压缩
2020/12/05 Javascript
[01:21]DOTA2周边文化主题展 神秘商店火热开售
2017/07/30 DOTA
python多进程操作实例
2014/11/21 Python
python 简单的多线程链接实现代码
2016/08/28 Python
Python3安装Scrapy的方法步骤
2017/11/23 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
2020/02/26 Python
Python Celery异步任务队列使用方法解析
2020/08/10 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
办理生育手续介绍信
2014/01/14 职场文书
工程项目建议书范文
2014/03/12 职场文书
交通安全主题班会
2015/08/12 职场文书
Spring Boot项目传参校验的最佳实践指南
2022/04/05 Java/Android