简单介绍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 SEO优化之URL优化方法
Apr 21 PHP
二招解决php乱码问题
Mar 25 PHP
PHP register_shutdown_function函数的深入解析
Jun 03 PHP
如何使用php绘制在图片上的正余弦曲线
Jun 08 PHP
php include和require的区别深入解析
Jun 17 PHP
PHP批量检测并去除文件BOM头代码实例
May 08 PHP
PHP实现显示照片exif信息的方法
Jul 11 PHP
php post大量数据时发现数据丢失问题解决方法
Jun 20 PHP
thinkPHP微信分享接口JSSDK用法实例
Jul 07 PHP
PHP ADODB生成下拉列表框功能示例
May 29 PHP
thinkPHP和onethink微信支付插件分享
Aug 11 PHP
php中加密解密DES类的简单使用方法示例
Mar 26 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
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
2014/06/23 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
JavaScript与HTML结合的基本使用方法整理
2015/10/12 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
PHP获取当前日期及本周一是几月几号的方法
2017/03/28 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
2020/05/02 PHP
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
常用的几段javascript代码分享
2014/03/25 Javascript
jQuery中trigger()方法用法实例
2015/01/19 Javascript
javascript HTML+CSS实现经典橙色导航菜单
2016/02/16 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
2018/07/24 Javascript
H5+C3+JS实现五子棋游戏(AI篇)
2020/05/28 Javascript
Vue v-for循环之@click点击事件获取元素示例
2019/11/09 Javascript
实例讲解React 组件生命周期
2020/07/08 Javascript
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
python显示生日是星期几的方法
2015/05/27 Python
Python使用Mechanize模块编写爬虫的要点解析
2016/03/31 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
win10下安装Anaconda的教程(python环境+jupyter_notebook)
2019/10/23 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
Python基于mediainfo批量重命名图片文件
2020/12/29 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
全面总结使用CSS实现水平垂直居中效果的方法
2016/03/10 HTML / CSS
使用HTML5的Canvas绘制曲线的简单方法
2015/09/08 HTML / CSS
什么样的创业计划书可行性高?
2014/02/01 职场文书
软件专业毕业生个人自我鉴定
2014/04/17 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
租车协议书
2015/01/27 职场文书
建议书范文
2015/02/05 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
电力培训学习心得体会
2016/01/11 职场文书
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis