简单介绍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 相关文章推荐
mac下安装nginx和php
Nov 04 PHP
php实现有趣的人品测试程序实例
Jun 08 PHP
php 把数字转换成汉字的代码
Jul 21 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
Sep 29 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
PHP实现mysqli批量执行多条语句的方法示例
Jul 22 PHP
PHP实现Redis单据锁以及防止并发重复写入
Apr 10 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
Oct 23 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
May 02 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
Jul 24 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实现合并discuz用户
2015/08/05 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
PHP使用file_get_contents发送http请求功能简单示例
2018/04/29 PHP
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
如何实现textarea里的不同文本显示不同颜色
2014/01/20 Javascript
jquery实现的美女拼图游戏实例
2015/05/04 Javascript
jQuery中DOM节点的删除方法总结(超全面)
2017/01/22 Javascript
原生js编写2048小游戏
2017/03/17 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
python Flask实现restful api service
2017/12/04 Python
python读取和保存图片5种方法对比
2018/09/12 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
python中的数据结构比较
2019/05/13 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
Python如何使用ConfigParser读取配置文件
2020/11/12 Python
让你相见恨晚的十个Python骚操作
2020/11/18 Python
python字符串拼接+和join的区别详解
2020/12/03 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
餐饮加盟计划书
2014/01/10 职场文书
2014年五四青年节演讲稿范文
2014/04/22 职场文书
白岩松演讲
2014/05/21 职场文书
体育教师个人总结
2015/02/09 职场文书
公司文体活动总结
2015/05/07 职场文书
关于党风廉政建设宣传教育月的活动总结!
2019/08/08 职场文书
导游词之桂林
2019/08/20 职场文书
「魔法少女伊莉雅」美游粘土人开订
2022/03/21 日漫
Java存储没有重复元素的数组
2022/04/29 Java/Android