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

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

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

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

抽象处理者(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();
  ?>

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

(0)

相关推荐

  • php单例模式示例分享

    单例模式主要使用于数据库的连接, 确保数据库一个类只有一个实例, 并且向整个系统提供这个实例.从而避免new操作消耗资源, 同时避免数据库出现too many connection信息. 要点有三个: 1. 必须只有一个实例. 2. 必须自动创建这个实例. 3. 必须向整个系统提供这个实例. 复制代码 代码如下: <?      class mysql{         privete static $instance ;//保存实例          //构造函数声明为private, 防止直

  • PHP基于工厂模式实现的计算器实例

    本文实例讲述了PHP基于工厂模式实现的计算器.分享给大家供大家参考.具体如下: abstract class Calculator { private $number1; private $number2; public $result; /** * @return the $number2 */ public function getNumber2() { return $this->number2; } /** * @param field_type $number2 */ public f

  • php基础设计模式大全(注册树模式、工厂模式、单列模式)

    废话不多说了,先给大家介绍注册树模式然后介绍工厂模式最后给大家介绍单列模式,本文写的很详细,一起来学习吧. php注册树模式 什么是注册树模式? 注册树模式当然也叫注册模式,注册器模式.之所以我在这里矫情一下它的名称,是因为我感觉注册树这个名称更容易让人理解.像前两篇一样,我们这篇依旧是从名字入手.注册树模式通过将对象实例注册到一棵全局的对象树上,需要的时候从对象树上采摘的模式设计方法.   这让我想起了小时候买糖葫芦,卖糖葫芦的将糖葫芦插在一个大的杆子上,人们买的时候就取下来.不同的是,注册树

  • php设计模式之单例模式实例分析

    本文实例讲述了php设计模式之单例模式.分享给大家供大家参考.具体分析如下: 单例模式(职责模式): 简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务: 单例类: 1.构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化: 2.拥有一个保存类的实例的静态成员变量 3.拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操

  • PHP单例模式详细介绍

    单例模式的概念 单例模式是指整个应用中某个类只有一个对象实例的设计模式.具体来说,作为对象的创建方式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例.它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用. 单例模式的特点 单例模式的主要特点是"三私一公": 需要一个保存类的唯一实例的私有静态成员变量 构造函数必须声明为私有的,防止外部程序new一个对象从而失去单例的意义 克隆函数必须声明为私有的,防止对象被克隆 必须提供一个访问这个实例的公共静态

  • PHP设计模式之适配器模式代码实例

    目标: 可将一个类的接口转换成客户希望的另外一个接口,使得原本不兼容的接口能够一起工作.通俗的理解就是将不同接口适配成统一的API接口. 角色: Target适配目标,该角色定义把其他类转换为何种接口,也就是我们的期望接口. Adaptee被适配者,就是需要被适配的接口. Adapter适配器,其他的两个角色都是已经存在的角色,而适配器角色是需要新建立的,它用来对Adaptee与Target接口进行适配. 应用场景: 如数据操作有mysql.mysqli.pdo.sqlite.postgresq

  • 解决ThinkPHP关闭调试模式时报错的问题汇总

    案例一: 最近用ThinkPHP开发一个项目,本地开发测试完成上传到服务器后,第一次打开正常,再刷新页面时就出现 "页面调试错误,无法找开页面,请重试"的错误. 我就郁闷啦,明明本地设置define('APP_DEBUG', false) 运行没点问题,怎么放到服务器上就出错了昵? baidu,Google还是没有找到解决方案,突然发现项目APP_Name/Runtime/Cache目录和APP_Name/Runtime/Logs目录没有可写权限,果断更改,F5,唉好啦,妈妈再也不用担

  • 详解PHP中的状态模式编程

    定义 状态模式,又称状态对象模式(Pattern of Objects for State),状态模式就是对象的行为模式.状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样 UML图 状态模式中主要角色 抽象状态角色(State):定义一个接口或抽象类State,用以封装环境对象的一个特定的状态所对应的行为 具体状态(ConcreteState)角色:每一个状态类都实现了环境(Context)的一个状态所对应的行为 环境(Context)角色:定义客户端所

  • php中注册器模式类用法实例分析

    本文实例讲述了php中注册器模式类用法.分享给大家供大家参考,具体如下: 注册器读写类 Registry.class.php <?php /** * 注册器读写类 */ class Registry extends ArrayObject { /** * Registry实例 * * @var object */ private static $_instance = null; /** * 取得Registry实例 * * @note 单件模式 * * @return object */ pu

  • PHP设计模式之装饰者模式代码实例

    定义: 装饰者模式就是不修改原类代码和继承的情况下动态扩展类的功能.传统的编程模式都是子类继承父类实现方法重载,使用装饰器模式,只需添加一个新的装饰器对象,更加灵活,避免类数量和层次过多. 角色: Component(被装饰对象基类) ConcreteComponent(具体被装饰对象) Decorator(装饰者基类) ContreteDecorator(具体的装饰者类) 示例代码: //被装饰者基类 interface Component { public function operatio

  • php单例模式实现方法分析

    本文实例讲述了php单例模式实现方法.分享给大家供大家参考.具体如下: <?php /** * @copyright 2013 maguowei.com * @author Ma Guowei <imaguowei@gmail.com> */ /** * 单例模式 * Class Single */ class Single { private $name; private static $single; private function __construct() { } public

随机推荐