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 - Html Transfer Code
Oct 09 PHP
提升PHP执行速度全攻略
Oct 09 PHP
PHP中的正规表达式(一)
Oct 09 PHP
在字符串指定位置插入一段字符串的php代码
Feb 16 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
Jun 18 PHP
Laravel最佳分割路由文件(routes.php)的方式
Aug 04 PHP
php图像处理函数imagecopyresampled用法详解
Dec 02 PHP
PHP定义字符串的四种方式详解
Feb 06 PHP
详解在YII2框架中使用UEditor编辑器发布文章
Nov 02 PHP
php中的explode()函数实例介绍
Jan 18 PHP
Thinkphp 框架配置操作之配置加载与读取配置实例分析
May 15 PHP
thinkphp5 路由分发原理
Mar 18 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使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
如何让thinkphp在模型中自动完成session赋值小教程
2014/09/05 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
动态加载js的几种方法
2006/10/23 Javascript
用javascript操作xml
2006/11/04 Javascript
Js 中debug方式
2010/02/07 Javascript
JS 实现导航栏悬停效果
2013/09/23 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
jquery实现一个简单好用的弹出框
2014/09/26 Javascript
jQuery使用addClass()方法给元素添加多个class样式
2015/03/26 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
Vue 中的compile操作方法
2018/02/26 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
ES6使用export和import实现模块化的方法
2018/09/10 Javascript
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
浏览器JavaScript调试功能无法使用解决方案
2020/09/18 Javascript
python pandas cumsum求累计次数的用法
2019/07/29 Python
python批量图片处理简单示例
2019/08/06 Python
django框架forms组件用法实例详解
2019/12/10 Python
python爬虫破解字体加密案例详解
2021/03/02 Python
Ado与Ado.net的相同与不同
2014/12/08 面试题
How TDD works
2012/09/30 面试题
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
大学生村官典型材料
2014/01/12 职场文书
党员干部承诺书范文
2014/03/25 职场文书
学历公证委托书
2014/04/09 职场文书
保护环境倡议书范文
2014/05/13 职场文书
单位消防安全责任书
2014/07/23 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
村级个人对照检查材料
2014/08/22 职场文书
大学生各类奖学金申请书
2019/06/24 职场文书
浅谈Redis缓冲区机制
2022/06/05 Redis