java-->责任链模式

😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊😊

前言:

今天,项目扩展要我进行模板文件校验。原本已经进行1号,2号,3号模板文件校验了,现新加了模板文件。。我需要再次基础上进行模板文件校验!我打开源代码开始再次基础上扩展,发现原来的人使用的是责任链模式,然后开始了解责任链,扩展完毕后发现!真tm好用!在此记录一下~

开始正文

该模式中,请求沿着责任链依次传递,直到有一个对象处理请求为止。责任链模式的核心是定义责任链节点的接口以及节点之间的关系,它允许动态的增加和修改责任链中的节点。

使用场景:

例如日志记录、异常处理、权限验证等。

我这次实际生产中用的相当于校验的作用了。

直接上代码:

java 复制代码
//和外部对接,让外部调用的责任链封装体
@Service
public class MyFilterHandler{
	@Autowired
	private List<MyFilter> chain;
	private MyFilter firstFilter;
	@PostConstruct
	private void constructChain(){
        if(chain==null||chain.size()==0){
            throw new RuntimeException("找不到责任链");
        }
        firstFilter=chain.get(0);
        for (int i = 0; i < chain.size(); i++) {
            if(i==chain.size());i++){
                chain.get(i).setNextFilter(null);
            }else{
                chain.get(i).setNextFilter(chain.get(i+1));
            }
        }
    }
    //供外调用方法
    public void executionChain(LoanBalanceVo vo){
        LoanBalanceVo process=null;
        process=firstFilter.process(vo);
        Map<String,Object> map= process.getResult();
        System.out.println(map);
    }
	
]

上面的LoanBalanceVo 对象就是用来封装责任来拿参数和处理返回结果,把返回结果放进result的map对象中,让外部调用的。

java 复制代码
@Data
class LoanBalanceVo {
    private Map<String,Object> result;
    private String businessId;
    public LoanBalanceVo(String businessId){
        this.businessId=businessId;
        this.result=new HashMap<>();
    }
    public void put(String a){
        result.put(a,a);
    }
}
java 复制代码
//责任链父类
abstract class MyFilter{
    private MyFilter nextFilter;
    public setNextFilter(MyFilter nextFilter){
        this.nextFilter=nextFilter;
    }
    public MyFilter getNextFilter(MyFilter nextFilter){
        return nextFilter;
    }
    public LoanBalanceVo process(LoanBalanceVo vo);
}

接下来就是五个子类分别实现抽象父类:

java 复制代码
@Order(1)
class A extends MyFilter{
    public LoanBalanceVo process(LoanBalanceVo vo){
        //处理逻辑
        return getNextFilter.process(vo);
    }
}
@Order(2)
class B extends MyFilter{
    public LoanBalanceVo process(LoanBalanceVo vo){
        //处理逻辑
        return getNextFilter.process(vo);
    }
}

@Order(3)
class C extends MyFilter{
    public LoanBalanceVo process(LoanBalanceVo vo){
        //处理逻辑
        return getNextFilter.process(vo);
    }
}
@Order(4)
class D extends MyFilter{
    public LoanBalanceVo process(LoanBalanceVo vo){
        //处理逻辑
        return getNextFilter.process(vo);
    }
}
@Order(5)
class E extends MyFilter{
    public LoanBalanceVo process(LoanBalanceVo vo){
        //处理逻辑
        return vo;
    }
}

外部调用:

java 复制代码
class my{
	@Resource
	private MyFilterHandler myFilterHandler;
    public static void main(String[] args) {
        myFilterHandler.executionChain(new LoanBalanceVo("123"));
    }
}

外面也有很多其他责任链demo,再多也是差不多类型的。在此记录实际用到的代码。

🙌🙌🙌🙌🙌🙌🙌🙌结束🙌🙌🙌🙌🙌🙌🙌🙌🙌

相关推荐
qianmoq3 分钟前
轻松掌握Java多线程 - 第二章:线程的生命周期
java·后端
风象南5 分钟前
Spring Boot 实现文件断点续传
java·spring boot·后端
Tadecanlan7 分钟前
[C++面试] 智能指针面试点(重点)续4
开发语言·c++·面试
Lecea_L11 分钟前
你能在K步内赚最多的钱吗?用Java解锁最大路径收益算法(含AI场景分析)
java·人工智能·算法
Tony8813 分钟前
热题100 - 394. 字符串解码
java·算法
cwtlw16 分钟前
JavaRedis和数据库相关面试题
java·数据库·笔记·面试
XF鸭16 分钟前
身份证正则表达式详解
java
快乐点吧18 分钟前
【Word】批注一键导出:VBA 宏
开发语言·c#·word
Lecea_L18 分钟前
🔍 找到数组里的“节奏感”:最长等差子序列
java·算法
JojO_o35 分钟前
frida 在安卓模拟器上的使用
java