随笔分类
职责链模式
Chain Of Responsibility
行为型模式之一
构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像链条一样紧密相连
-
对象链的组织
需要将某任务的所有职责执行对象以链的形式加以组织
-
消息或请求的传递
将消息或请求沿着对象链传递,以让处于对象链中的对象得到处理机会
-
处于对象链中的对象的职责分配
不同的对象完成不同的职责
-
任务的完成
处于对象链的末尾的对象结束任务停止信息或请求的继续传递
public abstract class CarHandler {
protected CarHandler carHandler;
public void setNextHandler(CarHandler carHandler){
this.carHandler = carHandler;
}
public abstract void handler();
}
public class CarHeadHandler extends CarHandler{
@Override
public void handler() {
System.out.println("组装车头");
if (this.carHandler != null) {
this.carHandler.handler();
}
}
}
public class CarBodyHandler extends CarHandler{
@Override
public void handler() {
System.out.println("组装车身");
if (this.carHandler != null) {
this.carHandler.handler();
}
}
}
public class CarTailHandler extends CarHandler{
@Override
public void handler() {
System.out.println("组装车尾");
if (this.carHandler != null) {
this.carHandler.handler();
}
}
}
/**
* 职责链模式
* 模拟汽车的组装顺序
* 车头 -> 车身 -> 车尾
*
* 组装车头
* 组装车身
* 组装车尾
*/
public class Client {
public static void main(String[] args) {
CarHandler carHead = new CarHeadHandler();
CarHandler carBody = new CarBodyHandler();
CarHandler carTail = new CarTailHandler();
//设置组装顺序
carHead.setNextHandler(carBody);
carBody.setNextHandler(carTail);
carHead.handler();
}
}
优点
-
职责的分担
每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则
-
可以根据需要自由组合工作流程
-
类与类之间可以松耦合的形式加以组织
缺点
实际处理的时候以链的形式在对象间传递信息,根据实现的不同,有可能会影响处理的速度
应用场景
- 例1:比如客户Client要完成一个任务,这个任务包括a,b,c,d四个部分。
首先客户Client把任务交给A,A完成a部分之后,把任务交给BIB完成b部分,..,直到D完成d部分。 - 例2:比如政府部分的某项工作,县政府先完成自己能处理的部分,不能处理的部分交给省政府,省政府再完成自己职责范围内的部分,不能处理的部分交给中央政府,中央政府最后完成该项工作
- 例3:软件窗口的消息传播
- 例4:SERVLET容器的过滤器(Filter)框架实现。