业务场景
一般的操作校验接口有参数校验、安全校验、黑名单校验、操作规则等等。
问题
常见同步编写code,校验失败return,代码链路较长,修改不符合开闭原则。
责任链模式定义
责任链模式为请求创建了一个接收者对象的链。执行链上有多个对象节点,每个对象节点都有机会(条件匹配)处理请求事务,如果某个对象节点处理完了,就可以根据实际业务需求传递给下一个节点继续处理或者返回处理完毕。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。
责任链模式使用
-
一个接口或者抽象类
-
每个对象差异化处理
-
对象链(数组)初始化(连起来)
责任链模式实现
抽象类:
-
有一个指向责任下一个对象的属性
-
一个设置下一个对象的set方法
-
给子类对象差异化实现的方法
public abstract class AbstractCheckHandler {
/**
* 责任链中的下一个对象
*/
private AbstractCheckHandler nextHandler;
/**
* 责任链的下一个对象
*/
public void setNextHandler(AbstractCheckHandler nextHandler) {
this.nextHandler = nextHandler;
}
/**
* 具体参数拦截逻辑,给子类去实现
*/
public void filter(Request request, Response response) {
handle(request, response);
// 处理结果为空或者成功,则继续处理;否则结束处理退出,不需要整条链路处理
if (ObjectUtil.isNull(response) || HttpStatusEnum.SERVER_SUCCESS.getCODE().equals(response.getCode())) {
if (getNextHandler() != null) {
getNextHandler().filter(request, response);
}
}
}
public AbstractCheckHandler getNextHandler() {
return nextHandler;
}
public abstract void handle(Request Request, Response response);
}
每个对象处理
即各种校验场景
/**
* 参数校验对象
**/
@Component
@Order(1) //顺序排第1,最先校验
public class CheckParamFilterObject extends AbstractCheckHandler {
@Override
public void doFilter(Request request, Response response) {
System.out.println("非空参数检查");
}
}
/**
* 安全校验对象
*/
@Component
@Order(2) //校验顺序排第2
public class CheckSecurityFilterObject extends AbstractCheckHandler {
@Override
public void doFilter(Request request, Response response) {
//invoke Security check
System.out.println("安全调用校验");
}
}
/**
* 黑名单校验对象
*/
@Component
@Order(3) //校验顺序排第3
public class CheckBlackFilterObject extends AbstractCheckHandler {
@Override
public void doFilter(Request request, Response response) {
//invoke black list check
System.out.println("校验黑名单");
}
}
对象处理责任链实现
@Component
public class RequestCheckHandlerChain {
/**
* 自动注入各个责任链的对象
*/
@Autowired
private List<AbstractCheckHandler> abstractHandleList;
private AbstractCheckHandler abstractHandler;
//spring注入后自动执行,责任链的对象连接起来
@PostConstruct
public void initializeChainFilter() {
for (int i = 0; i < abstractHandleList.size(); i++) {
if (i == 0) {
abstractHandler = abstractHandleList.get(0);
} else {
AbstractCheckHandler currentHander = abstractHandleList.get(i - 1);
AbstractCheckHandler nextHander = abstractHandleList.get(i);
currentHander.setNextHandler(nextHander);
}
}
}
//调用执行使用
public Response exec(Request request, Response response) {
abstractHandler.filter(request, response);
return response;
}
public AbstractCheckHandler getAbstractHandler() {
return abstractHandler;
}
public void setAbstractHandler(AbstractCheckHandler abstractHandler) {
this.abstractHandler = abstractHandler;
}
}
调用
@Autowired
private RequestCheckHandlerChain requestCheckHandlerChain;
...
requestCheckHandlerChain.exec(request, response);
End