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+JS无限级可伸缩菜单详解(简单易懂)
Jan 02 PHP
有关php运算符的知识大全
Nov 03 PHP
php mysql 判断update之后是否更新了的方法
Jan 10 PHP
浅析PHP绘图技术
Jul 03 PHP
使用php记录用户通过搜索引擎进网站的关键词
Feb 13 PHP
php获取百度收录、百度热词及百度快照的方法
Apr 02 PHP
Cygwin中安装PHP方法步骤
Jul 04 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
Mar 01 PHP
详解PHP匿名函数与注意事项
Mar 29 PHP
PHP实现带重试功能的curl连接示例
Jul 28 PHP
详解PHP实现支付宝小程序用户授权的工具类
Dec 25 PHP
redis+php实现微博(二)发布与关注功能详解
Sep 23 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生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
Date对象格式化函数代码
2010/07/17 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
JS中捕获console.log()输出的方法
2015/04/16 Javascript
JS实现的论坛Ajax打分效果完整实例
2015/10/31 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
Javascript设计模式之观察者模式(推荐)
2016/03/29 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
jQuery时间验证和转换为标准格式的时间格式
2017/03/06 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
node.js将MongoDB数据同步到MySQL的步骤
2017/12/10 Javascript
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
详解JS浏览器事件循环机制
2019/03/27 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
Map与WeakMap类型在JavaScript中的使用详解
2020/11/18 Javascript
python命令行参数sys.argv使用示例
2014/01/28 Python
Python中使用ConfigParser解析ini配置文件实例
2014/08/30 Python
python修改注册表终止360进程实例
2014/10/13 Python
Python作用域用法实例详解
2016/03/15 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
在Python函数中输入任意数量参数的实例
2019/07/16 Python
python同步两个文件夹下的内容
2019/08/29 Python
Python 实现一个手机号码获取妹子名字的功能
2019/09/25 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
澳大利亚网上买书:Angus & Robertson
2019/07/21 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
广州地球村科技数据库题目
2016/04/25 面试题
区域销售经理岗位职责
2013/12/10 职场文书
答谢会策划方案
2014/05/12 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang