设计模式(十五):责任链模式

责任链模式(Chain of Responsibility Pattern)

责任链模式将处理请求的对象连成一条链,沿着这条链传递该请求,直到有一个对象处理请求为止,这使得多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。

责任链模式在现实中使用的很多,常见的就是 OA 系统中的工作流、会员等级制度。

优点

  • 降低耦合度。它将请求的发送者和接收者解耦
  • 容易扩展:增加新的处理类很方便,允许动态地新增或者删除责任。

缺点

  • 不能保证请求一定被接收。
  • 请求会从链头发出,直到有处理者响应,在责任链比较长的时候会影响系统性能。
  • 可能不容易观察运行时的特征,有碍于除错。

示例代码

需求等级按程序员-技术经理-cto 的顺序处理:

抽象处理者:Handler

abstract class Handler {
    private $nextHandler;
    private $level;

    public function __construct($level) {
        $this->level = $level;
    }

    // 处理请求传递,注意final,子类不可重写
    public final void handleMessage(Demand $demand) {
        if ($this->level == $demand->demandLevel()) {
            this->report($demand);
        } else {
            if ($this->nextHandler != null) {
                this->$nextHandler->handleMessage($demand);
            } else {
                print_r("等级太高无法处理");
            }
        }
    }

    public function setNextHandler(Handler $handler) {
        $this->nextHandler = $handler;
    }

    // 抽象方法,子类实现
    abstract function report(Demand $demand);
}

具体处理者:

// 技术经理
class TechnicalManager extends Handler {
    @Override
    public void report(Demand $demand) {
        print_r("技术经理处理:" + $demand->detail());       
    }
}

// boss
public class CTO extends Handler {
    @Override
    public void report(Demand $demand) {
        print_r("CTO处理:" + $demand->detail());       
    }
}

客户端:

  $demand = new Demand(); 
  $cto = new CTO();
  $manager = new TechnicalManager();
  $manager->setNextHandler($cto); // 设置下一级
  $manager->handleMessage($demand);

可以看到在客户端中的重点是设置下一级的处理者,这样多个处理者对象就会形成一条链。级别低的请求程序员自己处理,级别高的传递给了下一级的技术经理和cto。对于处理者本身是没有层级关系的,层级关系是由客户端来分配的。

你可能感兴趣的:(设计模式(十五):责任链模式)