定义
定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象形成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
优缺点
优点
- 请求和处理相互分离,两者解耦,提高系统的灵活性。
缺点 - 当责任链比较长时,性能是一个非常大的问题,采用递归,调试逻辑比较复杂。
示例代码
/*
* 请求类
*/
public class Request
{
private int level;
private String requestMessage = "";
public Request(int level,String message){
this.level = level;
this.requestMessage = message;
}
public int getLevel(){
return this.level;
}
public String getRequest(){
return this.requestMessage;
}
}
/*
* 抽象处理类
*/
public abstract class Handler
{
public static final int ONE_LEVEl = 1;
public static final int TWO_LEVEl = 2;
public static final int THREE_LEVEl = 3;
private int level = 0;
private Handler next = null;
public Handler(int level){
this.level = level;
}
/**
* 处理链 可以做权限等等
* @param request
* @return
*/
public final String handelMessage(Request request){
String result = null;
if(request.getLevel()==this.level){
result = this.response(request.getRequest());
} else if (next != null) {
result = next.handelMessage(request);
}
return result;
}
public abstract String response(String message);
public void setNext(Handler handler){
this.next = handler;
}
public static void main(String[] args){
Request request = new Request(3, "外出");
TotalHandler totalHandler = new TotalHandler();
String response = totalHandler.handelMessage(request);
System.out.println(response);
}
/*
* 对外包装的一个类
*/
static class TotalHandler{
private OneHandler oneHandler;
private TwoHandler twoHandler;
private ThreeHandler threeHandler;
public TotalHandler(){
oneHandler = new OneHandler(ONE_LEVEl);
twoHandler = new TwoHandler(TWO_LEVEl);
threeHandler = new ThreeHandler(THREE_LEVEl);
oneHandler.setNext(twoHandler);
twoHandler.setNext(threeHandler);
}
public String handelMessage(Request request){
return oneHandler.handelMessage(request);
}
}
}
/*
* 具体的业务逻辑处理类,省略剩下的两个处理类
*/
public class OneHandler extends Handler
{
public OneHandler(int level)
{
super(level);
// TODO Auto-generated constructor stub
}
@Override
public String response(String message)
{
return "链1处理了:"+message+" 同意";
}
}
核心思想就是构造一个应答链表,挨个递归遍历,遇到对应的请求就由对应的链节点进行应答。