责任链
目的
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链发送该请求,直到有一个对象处理它为止。
类图
角色
- 抽象处理者(Handler)角色:定义了处理请求的接口或者抽象类,提供了处理请求的的方法和设置下一个处理者的方法。
- 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。
实现
抽象处理类
public abstract class Handler {
protected Handler nextHandler;
public Handler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
protected abstract boolean handleRequest(Request request);
}
请求信息
@Data
public class Request {
private RequestType type;
public Request(RequestType type) {
this.type = type;
}
}
具体处理类
public class ConcreteHandler1 extends Handler {
public Director(Handler nextHandler) {
super(nextHandler);
}
@Override
public void handleRequest(Request request) {
if (request.getType() == RequestType.type1) {
// 进行处理
}
return nextHandler.handleRequest(request); // 提交给下一个处理者处理
}
}
public class ConcreteHandler2 extends Handler {
public Director(Handler nextHandler) {
super(nextHandler);
}
@Override
public void handleRequest(Request request) {
if (request.getType() == RequestType.type2) {
// 进行处理
}
}
}
客户端
public static void main(String[] args) {
Handler handler2 = new ConcreteHandler1(null);
Handler handler1 = new ConcreteHandler2(handle2);
Request req = new Request(RequestType.type2);
handle1.handleRequest(req);
}
优缺点
优点
- 降低耦合度:客户端不需要知道请求由哪个处理者处理,而处理者也不需要知道处理者之间的传递关系,由系统灵活的组织和分配。
- 良好的扩展性:增加处理者的实现很简单,只需重写处理请求业务逻辑的方法。
缺点
- 请求会从链头发出,直到有处理者响应,在责任链比较长的时候会影响系统性能。
- 请求递归,调试排错比较麻烦。
使用场景
当客户提交一个请求时,请求是沿链传递直至有一个对象负责处理它。