定义
为请求的处理创建一个处理链条,链条上的每个节点都可以对请求作出相应的处理,类似于工厂中的生产线.
责任链模式的应用较广泛,如工作流,FilterChain,Storm对消息的处理等等.
缺点是当处理链条较长时,消息经过每一个节点处理,会牺牲较多性能.
示例
模拟多个节点对一条消息的处理,每个节点可以设置下一个节点.
1.抽象Handle类
public abstract class Handle {
//下一个handle
protected Handle nextHandle = null;
//设置下一个处理handle.
public void setNext(Handle nextHandle){
this.nextHandle = nextHandle;
}
//处理请求
protected abstract Response handleRequest(Request request);
//获取handle的处理条件
protected abstract String getCondition();
}
2.具体Handle类
注:设计模式之禅中将handleRequest在抽象handle中实现有一定局限,毕竟每个handle对消息的处理不同,应由具体handle类实现.
public class Handle1 extends Handle{
private final static String condition = "1";
@Override
public String getCondition() {
return condition;
}
@Override
protected Response handleRequest(Request request) {
Response response = null;
//如果请求条件与本handle的处理条件相同,则处理.
if(this.getCondition()==request.getReqCondition()){
response = new Response("请求条件与Handle1的处理条件相同,本条请求被Handle1处理!!!");
}else{//如果请求条件与handle的处理条件不同,则让下一个handle处理.
if(null == super.nextHandle){
response = new Response("请求走完所有handle仍未被处理!!!");
}
System.out.println("请求条件与handle1的处理条件不同,本条请求被发送至下一条!!!");
response = super.nextHandle.handleRequest(request);
}
return response;
}
}
public class Handle2 extends Handle{
private final static String condition = "2";
@Override
public String getCondition() {
return condition;
}
@Override
protected Response handleRequest(Request request) {
Response response = null;
//如果请求条件与本handle的处理条件相同,则处理.
if(this.getCondition()==request.getReqCondition()){
response = new Response("请求条件与Handle2的处理条件相同,本条请求被Handle2处理!!!");
}else{//如果请求条件与handle的处理条件不同,则让下一个handle处理.
if(null == super.nextHandle){
response = new Response("请求走完所有handle仍未被处理!!!");
}
System.out.println("请求条件与handle2的处理条件不同,本条请求被发送至下一条!!!");
response = super.nextHandle.handleRequest(request);
}
return response;
}
public class Handle3 extends Handle{
private final static String condition = "3";
@Override
public String getCondition() {
return condition;
}
@Override
protected Response handleRequest(Request request) {
Response response = null;
//如果请求条件与本handle的处理条件相同,则处理.
if(this.getCondition()==request.getReqCondition()){
response = new Response("请求条件与Handle3的处理条件相同,本条请求被Handle3处理!!!");
}else{//如果请求条件与handle的处理条件不同,则让下一个handle处理.
if(null == super.nextHandle){
response = new Response("请求走完所有handle仍未被处理!!!");
}
System.out.println("请求条件与handle3的处理条件不同,本条请求被发送至下一条!!!");
response = super.nextHandle.handleRequest(request);
}
return response;
}
}
3.请求体和响应体
public class Request {
//将请求的执行条件封装进request
private String reqCondition;
public Request(String reqCondition){
this.reqCondition = reqCondition;
}
public String getReqCondition(){
return reqCondition;
}
}
public class Response {
private String ResponseStr;
public Response(String ResponseStr){
this.ResponseStr = ResponseStr;
}
public String getResponseStr(){
return ResponseStr;
}
}
4.运行
public class Client {
public static void main(String[] args) {
Handle handle1 = new Handle1();
Handle handle2 = new Handle2();
Handle handle3 = new Handle3();
//设置处理链
handle1.setNext(handle2);
handle2.setNext(handle3);
//将请求发送至第一个handle
Response response = handle1.handleRequest(new Request("3"));
System.out.println(response.getResponseStr());
}
}
输出:
请求条件与handle1的处理条件不同,本条请求被发送至下一条!!!
请求条件与handle2的处理条件不同,本条请求被发送至下一条!!!
请求条件与Handle3的处理条件相同,本条请求被Handle3处理!!!