PHP设计模式——责任链模式

概述

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


UML图

描述一个简单责任链模式的实现

PHP设计模式——责任链模式_第1张图片

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

  • 抽象处理者(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设计模式——责任链模式)