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,再多也是差不多类型的。在此记录实际用到的代码。

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

相关推荐
闲猫几秒前
go 网络编程 websocket gorilla/websocket
开发语言·websocket·golang
m0_7482359517 分钟前
SpringBoot:解决前后端请求跨域问题(详细教程)
java·spring boot·后端
LUCIAZZZ32 分钟前
简单说一下什么是RPC
java·网络·网络协议·计算机网络·spring cloud·rpc
嘵奇35 分钟前
最新版IDEA下载安装教程
java·intellij-idea
终极定律41 分钟前
qt:输入控件操作
开发语言·qt
JenKinJia1 小时前
Windows10配置C++版本的Kafka,并进行发布和订阅测试
开发语言·c++
煤炭里de黑猫1 小时前
Lua C API :lua_insert 函数详解
开发语言·lua
笨鸟笃行1 小时前
爬虫第七篇数据爬取及解析
开发语言·爬虫·python
s_fox_1 小时前
Nginx Embedded Variables 嵌入式变量解析(4)
java·网络·nginx
编程乐趣1 小时前
一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略来了!
开发语言·c#