概念
-
责任链模式是一种行为设计模式 -
-
就是将一个东西(入参)按步骤顺序处理 -
每一个步骤(一个个实际处理入参的对象:可以抽出公共的接口或抽象类)对应相应的处理方式 -
东西通过这条加工链(步骤的对象数组)进行一步步的处理。 -
输出最终的产品(出参)。
-
使用方式
-
定义一个公共接口或者抽象类 -
创建每一步的对象去实现该接口或者抽象类 -
创建一个初始化类,将每一步串联起来
业务场景
-
我们在项目处理请求的时候,一个请求过来,我们可能进行 -
非空参数检查 -
安全调用校验 -
校验黑名单 -
规则拦截对象
-
代码实现
-
定义一个公共接口或者抽象类
/**
* @Description: 定义一个接口或者抽象类
*/
public abstract class AbstractHandler {
/**
* 责任链中的下一个对象
*/
private AbstractHandler nextHandler;
//串连所有操作
public void filter(HttpServletRequest request, HttpServletResponse response) {
//执行当前链
doFilter(request, response);
//如果还有下个链,执行下个链
if (getNextHandler() != null) {
getNextHandler().filter(request, response);
}
}
//获取下一个链对象
public AbstractHandler getNextHandler() {
return nextHandler;
}
//插入责任链的下一个对象
public void setNextHandler(AbstractHandler nextHandler){
this.nextHandler = nextHandler;
}
abstract void doFilter(HttpServletRequest request, HttpServletResponse response);
} -
创建每一步的对象去实现该接口或者抽象类
-
非空参数检查
/**
* 1、非空参数检查对象
**/
@Component
@Order(1) //顺序排第1,最先校验
public class CheckParamFilterObject extends AbstractHandler {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response) {
System.out.println("1、非空参数检查");
}
} -
安全调用校验
/**
* 2、安全校验对象
*/
@Component
@Order(2) //校验顺序排第2
public class CheckSecurityFilterObject extends AbstractHandler {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response) {
//invoke Security check
System.out.println("2、安全调用校验");
}
} -
校验黑名单
/**
* 3、黑名单校验对象
*/
@Component
@Order(3) //校验顺序排第3
public class CheckBlackFilterObject extends AbstractHandler {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response) {
//invoke black list check
System.out.println("3、校验黑名单");
}
} -
规则拦截对象
/**
* 4、规则拦截对象
*/
@Component
@Order(4) //校验顺序排第4
public class CheckRuleFilterObject extends AbstractHandler {
@Override
public void doFilter(HttpServletRequest request, HttpServletResponse response) {
//check rule
System.out.println("4、规则拦截对象");
}
}
-
-
创建一个初始化类,将每一步串联起来
/**
* @Description: 对象链连起来(初始化)对象
*/
@Component("ChainPatternDemo")
public class ChainPatternDemo {
//自动注入各个责任链的对象
@Autowired
private List<AbstractHandler> abstractHandleList;
private AbstractHandler abstractHandler;
//spring注入后自动执行,责任链的对象连接起来
@PostConstruct
public void initializeChainFilter(){
for(int i = 0;i<abstractHandleList.size();i++){
if(i == 0){
abstractHandler = abstractHandleList.get(0);
}else{
AbstractHandler currentHander = abstractHandleList.get(i - 1);
AbstractHandler nextHander = abstractHandleList.get(i);
currentHander.setNextHandler(nextHander);
}
}
}
//直接调用这个方法使用,返回最后处理好的response
public HttpServletResponse exec(HttpServletRequest request, HttpServletResponse response) {
//这里 abstractHandler 就是第一个 接下来就会一个一个向下
abstractHandler.filter(request, response);
return response;
}
} -
调用
@RestController
public class PayController {
@Autowired
private ChainPatternDemo chainPatternDemo;
@RequestMapping("/testHandler")
public void testHandler(HttpServletRequest req, HttpServletResponse resp){
//调用责任链
chainPatternDemo.exec(req,resp);
}
} -
结果
1、非空参数检查
2、安全调用校验
3、校验黑名单
4、规则拦截对象
本文由 mdnice 多平台发布