概念
- 责任链模式是一种行为设计模式
- 就是将一个货色(入参)按步骤程序解决
- 每一个步骤(一个个理论解决入参的对象:能够抽出公共的接口或抽象类)对应相应的解决形式
- 货色通过这条加工链(步骤的对象数组)进行一步步的解决。
- 输入最终的产品(出参)。
应用形式
- 定义一个公共接口或者抽象类
- 创立每一步的对象去实现该接口或者抽象类
- 创立一个初始化类,将每一步串联起来
业务场景
咱们在我的项目解决申请的时候,一个申请过去,咱们可能进行
- 非空参数查看
- 平安调用校验
- 校验黑名单
- 规定拦挡对象
代码实现
定义一个公共接口或者抽象类
/** * @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) //校验程序排第2public class CheckSecurityFilterObject extends AbstractHandler { @Override public void doFilter(HttpServletRequest request, HttpServletResponse response) { //invoke Security check System.out.println("2、平安调用校验"); }}
校验黑名单
/** * 3、黑名单校验对象 */@Component@Order(3) //校验程序排第3public class CheckBlackFilterObject extends AbstractHandler { @Override public void doFilter(HttpServletRequest request, HttpServletResponse response) { //invoke black list check System.out.println("3、校验黑名单"); }}
规定拦挡对象
/** * 4、规定拦挡对象 */@Component@Order(4) //校验程序排第4public 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; }}
调用
@RestControllerpublic class PayController { @Autowired private ChainPatternDemo chainPatternDemo; @RequestMapping("/testHandler") public void testHandler(HttpServletRequest req, HttpServletResponse resp){ //调用责任链 chainPatternDemo.exec(req,resp); }}
后果
1、非空参数查看2、平安调用校验3、校验黑名单4、规定拦挡对象
本文由mdnice多平台公布