简单介绍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 相关文章推荐
MYSQL环境变量设置方法
Jan 15 PHP
PHP 源代码压缩小工具
Dec 22 PHP
PHP 第二节 数据类型之转换
Apr 28 PHP
深入解析PHP中的(伪)多线程与多进程
Jul 01 PHP
php curl模拟post请求小实例
Nov 13 PHP
php 伪静态之IIS篇
Jun 02 PHP
PHP依赖倒置(Dependency Injection)代码实例
Oct 11 PHP
php基于Snoopy解析网页html的方法
Jul 09 PHP
php实现购物车功能(上)
Jul 23 PHP
Zend Framework教程之Zend_Config_Xml用法分析
Mar 23 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
Oct 10 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
Oct 11 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
PHP4实际应用经验篇(4)
2006/10/09 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
2014/06/22 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
Table冻结表头示例代码
2013/08/20 Javascript
javascript数据类型验证方法
2015/12/31 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
学习vue.js表单控件绑定操作
2016/12/05 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
angularjs点击图片放大实现上传图片预览
2017/02/24 Javascript
js获取json中key所对应的value值的简单方法
2020/06/17 Javascript
Angular 4.x 动态创建表单实例
2017/04/25 Javascript
vue2实现数据请求显示loading图
2017/11/28 Javascript
JavaScript实现求最大公共子串的方法
2018/02/03 Javascript
Vue实现移动端页面切换效果【推荐】
2018/11/13 Javascript
Vue框架TypeScript装饰器使用指南小结
2019/02/18 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
python使用arp欺骗伪造网关的方法
2015/04/24 Python
Django框架的使用教程路由请求响应的方法
2018/07/03 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
adidas美国官网:adidas US
2016/09/21 全球购物
新加坡最受追捧的体验平台:Hapz
2018/01/01 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
工厂厂长岗位职责
2013/11/08 职场文书
园林施工员岗位职责
2013/12/11 职场文书
致400米运动员广播稿
2014/02/07 职场文书
个人工作总结范文2014
2014/11/07 职场文书
武夷山导游词
2015/02/03 职场文书
2015年度党员个人总结
2015/02/14 职场文书
Redis基于Bitmap实现用户签到功能
2021/06/20 Redis