责任链模式(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。对于处理者本身是没有层级关系的,层级关系是由客户端来分配的。
网友评论