<?php
/**
* 3.5 职责链模式
* 定义:
* 使多个对象都有机会处理请求,从而避免请求的
* 发送者和接受者直接的耦合关系。将这个对象连
* 成一条链,并沿着这条链传递该请求,直到有一
* 个对象处理它为止。
* 角色:
* 1. 抽象Handler类
* 职责:定义一个处理请示的接口。
* 2. 具体Handler类
* 职责:具体处理者类,处理它所负责的请求
* ,它可访问它的后继者,如果可处理
* 该请求,就处理之,否则就将该请求
* 转发给它的后继者。
*
* 优点:
* 1. 增强了系统的可扩展性;
* 2. 是可以避免过多的if或if-else语句;
* 3. 减小了对象之间的耦合性;
* 4. 可以根据需要自由组合工作流程。如工作流程
* 发生变化,可以通过重新分配对象链便可适应
* 新的工作流程;
* 5. 责任分担。每个类只需处理自己该处理的工作
* (不该处理的传递给下一个对象完成),明确
* 各类的责任范围,符合单一职责原则。
*
* 缺点:
* 1. 使用此模式时会产生多处理者对象,但实际使
* 用的处理者对象却只有一个,这在某种程度讲
* 是资源的浪费。
* 2. 职责链建立的合理性要靠客户端来保证,增加
* 了程序的复杂性,也有可能由于职责链导致出
* 错。
*
* 使用场景:
* 1. 有多个对象可以处理一个请求,具体是哪个对象
* 处理该请求运行时自动确定。
* 2. 你想在不明确指定接受者的情况下,向多个对象
* 中的一个提交一个请求。
* 3. 可处理一个请求的对象集合应被动态指定。
*/
//抽象Handler类
abstract class Handler{
protected $successor;
public function setSuccessor(Handler $successor){
$this->successor=$successor;
}
abstract public function handlerRequest($request);
}
//具体Handler类
class ConcreteHandler1 extends Handler{
public function handlerRequest($request){
if($request >= 0 && $request < 10){
echo get_class($this).'处理请求'.$request;
}else if($this->successor != null){
$this->successor->handlerRequest($request);
}
}
}
class ConcreteHandler2 extends Handler{
public function handlerRequest($request){
if($request >= 10 && $request < 20){
echo get_class($this).'处理请求'.$request;
}else if($this->successor != null){
$this->successor->handlerRequest($request);
}
}
}
class ConcreteHandler3 extends Handler{
public function handlerRequest($request){
if($request >= 20 && $request < 30){
echo get_class($this).'处理请求'.$request;
}else if($this->successor != null){
$this->successor->handlerRequest($request);
}
}
}
//客户端
//生成请求的具体处理对象
$h1=new ConcreteHandler1();
$h2=new ConcreteHandler2();
$h3=new ConcreteHandler3();
//设置处理对象的下一个负责人(即处理请求的对象)
$h1->setSuccessor($h2);
$h2->setSuccessor($h3);
//具体的请求有职责链的第一个接收
$h1->handlerRequest(20);
?>