简单介绍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 和 MySQL 基础教程(一)
Oct 09 PHP
PHP 5.3新特性命名空间规则解析及高级功能
Mar 11 PHP
PHP 文件缓存的性能测试
Apr 25 PHP
php下连接mssql2005的代码
Jan 17 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
Thinkphp搭建包括JS多语言的多语言项目实现方法
Nov 24 PHP
PHP模板引擎Smarty内置变量调解器用法详解
Apr 11 PHP
php实现数据库的增删改查
Feb 26 PHP
PHP 实现公历日期与农历日期的互转换
Sep 13 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
Jul 20 PHP
PHP学习记录之常用的魔术常量详解
Dec 12 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
Aug 30 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之第三天
2006/10/09 PHP
php 模拟POST提交的2种方法详解
2013/06/17 PHP
laravel 4安装及入门图文教程
2014/10/29 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
ThinkPHP中使用Ueditor富文本编辑器
2015/09/02 PHP
JS下拉框内容左右移动效果的具体实现
2013/07/10 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
javascript实现控制文字大中小显示
2015/04/28 Javascript
jquery实现表格隔行换色效果
2015/11/19 Javascript
JS实现简易换图时钟功能分析
2018/01/04 Javascript
JS数组Reduce方法功能与用法实例详解
2020/04/29 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
详解vue 组件注册
2020/11/20 Vue.js
python利用高阶函数实现剪枝函数
2018/03/20 Python
对Python random模块打乱数组顺序的实例讲解
2018/11/08 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
Python的高阶函数用法实例分析
2019/04/11 Python
Python发展史及网络爬虫
2019/06/19 Python
python使用多线程编写tcp客户端程序
2019/09/02 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
openCV提取图像中的矩形区域
2020/07/21 Python
Python如何在bool函数中取值
2020/09/21 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
Python eval函数原理及用法解析
2020/11/14 Python
详解如何使用Pytest进行自动化测试
2021/01/14 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
北京某公司的.net笔试题
2014/03/20 面试题
工程造价专业大专生求职信
2013/10/06 职场文书
受欢迎的大学生自我评价
2013/12/05 职场文书
法定代表人授权委托书范本
2014/10/07 职场文书
营销与策划实训报告
2014/11/05 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
教师年度个人总结
2015/02/11 职场文书
亮剑观后感500字
2015/06/05 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书