责任链模式
什么是责任链模式
责任链模式就是有多个对象的情况下,每个对象都可以传值给下个对象,然后依次往下到最后一个对象,形成一条链。而请求的发出者发出请求,沿着链依次传递值到最后接收者(不一定是最后的节点)。这就保证了请求者和接收者的解耦,请求内容会从头到尾,但是请求者与接收者却毫无关系并且请求者对于到底是谁处理了请求也全然不知。
- 通俗解释
像链表一样,明确前后节点的关系,然后前一个节点通过了,调用下一个节点处理,到达尾部没有节点,链条结束。
例子
- 处理请求
public class Request {
private String requestType;
private String requestContent;
public String getRequestType() {
return requestType;
}
public void setRequestType(String requestType) {
this.requestType = requestType;
}
public String getRequestContent() {
return requestContent;
}
public void setRequestContent(String requestContent) {
this.requestContent = requestContent;
}
}
- 抽象处理者
public abstract class AbstractHandler {
private AbstractHandler nextHandler;
public void setNextHandler(AbstractHandler nextHandler) {
this.nextHandler = nextHandler;
}
public AbstractHandler getNextHandler() {
return nextHandler;
}
public abstract void handle(Request request);
}
- 一级处理者
public class FirstHandler extends AbstractHandler {
public boolean firstAgree() {
return true;
}
@Override
public void handle(Request request) {
if (request.getRequestType().equals("请假")) {
if (firstAgree()) {
System.out.println("======== 一级审批通过!");
if (Objects.isNull(super.getNextHandler())) {
System.out.println("======== 审批过程已结束!");
return;
} else {
super.getNextHandler().handle(request);
}
}
}
}
}
- 二级处理者
public class SecondHandler extends AbstractHandler {
public boolean secondAgree() {
return true;
}
@Override
public void handle(Request request) {
if (request.getRequestType().equals("请假")) {
if (secondAgree()) {
System.out.println("======== 二级审批通过!");
if (Objects.isNull(super.getNextHandler())) {
System.out.println("======== 审批过程已结束!");
return;
} else {
super.getNextHandler().handle(request);
}
}
}
}
}
- 三级处理者
public class ThirdHandler extends AbstractHandler {
public boolean thirdAgree() {
return true;
}
@Override
public void handle(Request request) {
if (request.getRequestType().equals("请假")) {
if (thirdAgree()) {
System.out.println("======== 三级审批通过!");
if (Objects.isNull(super.getNextHandler())) {
System.out.println("======== 审批过程已结束!");
return;
} else {
super.getNextHandler().handle(request);
}
}
}
}
}