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
使用 eAccelerator加速PHP代码的目的
Mar 16 PHP
Gregarius中文日期格式问题解决办法
Apr 22 PHP
一步一步学习PHP(7) php 字符串相关应用
Mar 05 PHP
PHP提示Notice: Undefined variable的解决办法
Nov 24 PHP
深入eAccelerator与memcached的区别详解
Jun 06 PHP
学习php分页代码实例
Oct 24 PHP
php导出CSV抽象类实例
Sep 24 PHP
分享常见的几种页面静态化的方法
Jan 08 PHP
使用Yii2实现主从数据库设置
Nov 20 PHP
PHP实现二维数组根据key进行排序的方法
Dec 30 PHP
PHP序列化的四种实现方法与横向对比
Nov 29 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 和 MySQL 基础教程(四)
2006/10/09 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
2017/10/22 PHP
PHP中通过getopt解析GNU C风格命令行选项
2019/11/18 PHP
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
用js设置下拉框为只读的小技巧
2014/04/10 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
详解JavaScript中this的指向问题
2017/01/20 Javascript
React diff算法的实现示例
2018/04/20 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
vue柱状进度条图像的完美实现方案
2019/08/26 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
python实现博客文章爬虫示例
2014/02/26 Python
python2 与python3的print区别小结
2018/01/16 Python
Python3处理HTTP请求的实例
2018/05/10 Python
python使用RNN实现文本分类
2018/05/24 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
python的移位操作实现详解
2019/08/21 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
python热力图实现简单方法
2021/01/29 Python
联想中国官方商城:Lenovo China
2017/10/18 全球购物
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
班班通校本培训方案
2014/03/12 职场文书
贷款委托书范本
2014/04/08 职场文书
文明和谐家庭事迹材料
2014/05/18 职场文书
法定代表人资格证明书
2014/09/11 职场文书
2014年仓管员工作总结
2014/11/18 职场文书
员工工作能力评语
2014/12/31 职场文书
毕业生评语大全
2015/01/04 职场文书
陈斌强事迹观后感
2015/06/17 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang
如何在Python项目中引入日志
2021/05/31 Python
JS高级程序设计之class继承重点详解
2022/07/07 Javascript