06月29, 2016

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

什么是责任链模式

责任链模式为请求者创造了一个接收对象的链条,主要是对请求者和接收者进行解耦。这种模式中,每一个接收者都要记录他的上级,如果他不能处理完这个请求,那么把请求转发给上级。

举例说明

比如公司审批文件,普通文件只要组长审核就好了,较重要的文件可能需要部门经理,部门经理再审核不了可能就要让总裁来了。下面我们用代码实现这个例子。

代码实现

<?php

/**
 * Class GroupLeader
 */
class GroupLeader {

    private $level = 5; //可以处理的级别

    protected $nextHandler = "DepartmentManager";

    public function handle($message, $level)
    {
        if ($level <= $this->level) {
            echo "组长我批准$message";
        } else {
            $handler = new $this->nextHandler;
            $handler->handle($message, $level);
        }
    }

}

class DepartmentManager {

    private $level = 10; //可以处理的级别

    protected $nextHandler = "CEO";

    public function handle($message, $level)
    {
        if ($level <= $this->level) {
            echo "经理我批准$message";
        } else {
            $handler = new $this->nextHandler;
            $handler->handle($message, $level);
        }
    }

}

class CEO {

    public function handle($message, $level)
    {
        echo "CEO我批准$message";
    }

}

$request = new GroupLeader();

$request->handle("找个程序员鼓励师", 20);

上面实现了一个例子,我们提出个需求,要找一个程序员鼓励师,我们设定他的审批级别很高(因为需要花钱)。我们只把他上报给了我们的上级组长,但最终却是由CEO 处理了我们的请求。

责任链模式缺点

  1. 实例化了很多类,当责任链前几环处理不了我们的请求时,意味着我们要实例化更多类去处理。
  2. 整个责任链不符合面向对象的开闭原则。如果要在责任链中间加一个环节,需要修改他的上一个环节的下级。

本文链接:http://www.qiana.info/post/chain.html

-- EOF --

Comments