简单介绍PHP的责任链编程模式


Posted in PHP onAugust 11, 2015

概述
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态的重新组织和分配责任

责任链模式的定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
 
责任链模式的优点
最为显著的优点就是将请求和处理分开。请求者可以不用知道是谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。
  
责任链模式的缺点
一是性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候,性能是一个问题。二是调试不是很方便,特别是链条比较长的,环节比较多的时候,由于采用了类似递归的方式 ,调试的时候逻辑可能比较复杂。

责任链模式涉及到的角色如下:

    抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法以设定和返回对下家的引用。这个角色通常由一个php的抽象类或接口实现。上图中Handler类的聚合关系给出了具体子类对下家的引用,抽象方法handleRequest()规范了子类处理请求的操作
    具体处理者(ConcreateHandle)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理这可以访问下家

来看一个PHP的责任链模式编程实例:
 

<?php 
   
  /** 
   * 抽象处理者角色 
   * @author wzy 
   * 
   */ 
  abstract class Handle 
  { 
   
    /** 
     * 持有后继的责任对象 
     * 
     * @var object 
     */ 
    protected $successor; 
   
    /** 
     * 示意处理请求的方法,虽然这个示意方法是没有传入参素的 
     * 但实际是可以传入参数的,根据具体需要来选择是否传递参数 
     */ 
    public abstract function handleRequest (); 
   
    /** 
     * 取值方法 
     * 
     * @return object 
     */ 
    public function getSuccessor () 
    { 
      return $this->successor; 
    } 
   
    /** 
     * 赋值方法,设置后继的责任对象 
     * 
     * @param object $objsuccessor       
     */ 
    public function setSuccessor ($objsuccessor) 
    { 
      $this->successor = $objsuccessor; 
    } 
  } 
   
  /** 
   * 具体处理者角色 
   * 
   * @author wzy 
   *     
   */ 
  class ConcreateHandler extends Handle 
  { 
   
    /** 
     * 判断是否有后继的责任对象 
     * 如果有,就转发请求给后继的责任对象 
     * 如果没有,则处理请求 
     * 
     * @see Handle::handleRequest() 
     */ 
    public function handleRequest () 
    { 
      if ($this->getSuccessor() != null) { 
        echo "放过请求,将请求转发给后继的责任对象!<br>"; 
        $this->getSuccessor()->handleRequest(); 
      } else { 
        echo "处理请求,处理过程省略...<br>"; 
      } 
    } 
  } 
   
  /** 
   * 客户端代码 
   */ 
   
  // 组装责任链 
  $handle1 = new ConcreateHandler(); 
  $handle2 = new ConcreateHandler(); 
  $handle1->setSuccessor($handle2); 
   
  // 提交请求 
  $handle1->handleRequest(); 
  ?>

通过代码可以看出,客户端创建了两个处理者对象,并指定第一个处理者对象的下家是第二个处理者对象,而第二个处理者对象却没有下家。然后客户端将请求传递给第一个处理者对象

PHP 相关文章推荐
PHP下利用header()函数设置浏览器缓存的代码
Sep 01 PHP
PHP安全技术之 实现php基本安全
Sep 04 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
php代码审计比较有意思的例子
May 07 PHP
教你如何解密 “ PHP 神盾解密工具 ”
Jun 20 PHP
Drupal简体中文语言包安装教程
Sep 27 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
Jul 06 PHP
apache和PHP如何整合在一起
Oct 12 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
PHP pear安装配置教程
May 14 PHP
iis6手工创建网站后无法运行php脚本的解决方法
Jun 08 PHP
php实例化对象的实例方法
Nov 17 PHP
PHP会话处理的10个函数
Aug 11 #PHP
PHP的Socket网络编程入门指引
Aug 11 #PHP
php实现的农历算法实例
Aug 11 #PHP
PHP发送短信代码分享
Aug 11 #PHP
php实现可逆加密的方法
Aug 11 #PHP
PHP实现获取某个月份周次信息的方法
Aug 11 #PHP
PHP实现删除字符串中任何字符的函数
Aug 11 #PHP
You might like
php基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
php采集速度探究总结(原创)
2008/04/18 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
PHP实现上传文件并存进数据库的方法
2015/07/16 PHP
php去掉文件前几行的方法
2015/07/29 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
input 输入框内的输入事件详细分析
2010/03/17 Javascript
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
Jquery 返回json数据在IE浏览器中提示下载的问题
2014/05/18 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
微信小程序-滚动消息通知的实例代码
2017/08/03 Javascript
webpack引入eslint配置详解
2018/01/22 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
Javascript ParentNode和ChildNode接口原理解析
2020/03/16 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
Python实现的彩票机选器实例
2015/06/17 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
解决Python一行输出不显示的问题
2018/12/03 Python
HTML5通用接口详解
2016/06/12 HTML / CSS
美国摄影爱好者购物网站:Focus Camera
2016/10/21 全球购物
2014年党务公开实施方案
2014/02/27 职场文书
调查研究项目计划书
2014/04/29 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
十佳少年事迹材料
2014/12/25 职场文书
免职通知
2015/04/23 职场文书
转正申请报告格式
2015/05/15 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis
公历12个月名称的由来
2022/04/12 杂记