本文介绍责任链模式的基本结构、应用场景、以及现有一些成熟框架的应用
简介
Chain of Responsibility(CoR)模式也叫职责链模式、责任链模式。是行为模式之一
责任链模式构造一系列分别担当不通的职责的类的对象来共同完成一个任务,他们像链条一样紧密相连,所以被称作职责链模式。
简单一点理解就是:工厂流水线工作
举例应用场景说明
- 一场足球赛,A队的2个组成队a、b。a队踢上半场,踢完后交给b队踢下半场,一起完成这场球赛。
- 吃一条鱼:妈妈吃鱼头,吃完让儿子吃鱼身体,吃完给爸爸吃鱼尾巴。
- Servlet容器的过滤器
责任链就是这样有一条执行链来完成一件事。
职责和角色
- Handler:处理类的抽象父类
- concreteHandler:具体的处理类
设计使用责任链的基本流程
- 组织对象链:将某人物的所有职责执行对象以链的形式加以组织起来
- 消息或请求的传递:将消息或请求沿着对象链传递,让处于对象链中的对象得到处理机会
- 对象链中对象的职责分配:不同对象完成不同职责
- 任务的完成:对象链末尾的对象结束任务并停止消息或请求的继续传递。
结构图
实现
同样以造车的流水线为需求
处理器的抽象类
package com.mym.designmodel.CoRModel;
/**
* 职责:Handler 职责类的抽象父类
*/
public abstract class AbstractCarHandler {
AbstractCarHandler carHandler = null;
public abstract void carHandler();
public AbstractCarHandler setNextCarHandler(AbstractCarHandler nextCarHandler){
this.carHandler = nextCarHandler;
return this.carHandler;
}
/**职责下传*/
protected void doChain(){
if(this.carHandler != null){
this.carHandler.carHandler();
}
}
}
责任链一个执行者1
package com.mym.designmodel.CoRModel;
/**
* 职责:concreteHandler 具体的处理类
*/
public class CarHeadHandler extends AbstractCarHandler {
@Override
public void carHandler() {
System.out.println("处理车的head!");
//下传
this.doChain();
}
}
责任链一个执行者2
package com.mym.designmodel.CoRModel;
/**
* 职责:concreteHandler 具体的处理类
*/
public class CarBodyHandler extends AbstractCarHandler {
@Override
public void carHandler() {
System.out.println("处理车的body!");
//下传
this.doChain();
}
}
责任链一个执行者3
package com.mym.designmodel.CoRModel;
/**
* 职责:concreteHandler 具体的处理类
*/
public class CarTailHandler extends AbstractCarHandler {
@Override
public void carHandler() {
System.out.println("处理车的tail!");
//下传
this.doChain();
}
}
测试
测试相当于客户端client
package com.mym.designmodel.CoRModel;
/**
* 测试
*/
public class MainClass {
public static void main(String[] args) {
AbstractCarHandler carheadHandle = new CarHeadHandler();
AbstractCarHandler carbodyHandle = new CarBodyHandler();
AbstractCarHandler carTailHandler = new CarTailHandler();
//组装责任链
carheadHandle.setNextCarHandler(carbodyHandle).setNextCarHandler(carTailHandler);
//链头部开始执行
carheadHandle.carHandler();
}
}
执行结果:
处理车的head!
处理车的body!
处理车的tail!
责任链在于构造一个链式执行的流程,启动执行时只需要启动链的头部即可。
责任链的使用
笔者列举一些框架中比较典型的责任链处理
- Restlet中的Finder路由。Restlet中的top类就是Restlet.class,中层的各个组件由Finder链接起来,一个请求的路由过程就是一个责任链的执行过程。
- Servlet的filter
- springMVC的拦截器
- Netty中通道上的Handler也是责任链处理模式
等等。。。
责任链模式常使用在对消息、请求的过滤上(预处理)。