责任链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。

例子:普通员工发起一个请假申请,当请假天数小于3天时只需要得到主管批准即可;
当请假天数大于3天时,主管批准后还需要提交给经理审批,经理审批通过,若请假天数大于7天还需要进一步提交给总经理审批。


下面是一个举报帖子的例子,举报等级从小到大 版主 -> 管理员 -> 警察

<?php
/**
 * 责任链(职责链)模式 完成举报功能
 * 这样在客户端调用的时候,就不要使用if语句等判断级别
 *
 */

/**
 * 版主类
 *
 */
class bord{
    /**
     * 版主的处理权限级别
     */
    public $power = 1;

    /**
     * 他上级是admin
     */
    protected $top = 'admin';    
    public function process($lev){
        if ($lev <= $this->power) {
            echo '版主处理:删除帖子!';
        }else{
            $top = new $this->top;
            $top->process($lev);
        }

    }
}

/**
 * 管理员类
 *
 */
class admin{
    /**
     * 管理员的处理权限级别
     */
    public $power = 2;

    /**
     * 他上级是admin
     */
    protected $top = 'police';

    public function process($lev){
        if ($lev <= $this->power) {
            echo '管理员处理:封帐号!';
        }else{
            $top = new $this->top;
            $top->process($lev);
        }
    }
}

/**
 * 警察类
 *
 */
class police{
/**
     *警察的处理权限级别
     * @var unknown
     */
    public $power = 3;

    /**
     * 他上级是暂时为空,以后可扩展
     * @var unknown
     */
    protected $top = null;

    public function process($lev){
        if ($lev <= $this->power) {
            echo '警察处理:抓起来!';
        }else{
            echo '其它处理';
        }
    }
}

// 客户端调用
$lev = 1;
$judge = new bord();
$judge->process($lev);