责任链模式
概念简介
使多个对象都有机会处理同一请求,从而避免请求的发送者和接收者之间的耦合关系,将这些处理者对象连成一条链,请求延着这条链传递,直到满足条件的处理者去处理请求。
为何而生
假设有一个情景我们需要在一堆杂物中过滤掉沙子和石块留下黄金,通常情况来写我们需要写的代码是if 含有石块则过滤石块,if 含有沙子 则过滤沙子,这样写当然可以。但是不够灵活不够优雅,不论是我现在需要改动过滤的先后顺序还是我需要新增过滤杂物的种类,比如过滤铁杂质,都需要大量改动代码。这时候使用责任链模式就可以解决这个问题。
标准的责任链模式,个人总结有以下要点:
1.保证处于责任链上的处理对象每一个都有处理请求的机会
2.既然请求需要在链上传递,那么除了链末对象其余处于链上的对象都要持有下一对象的引用,才能将请求传递下去
3.当链上的某个对象无法处理请求时,他要把相同的请求传给下一对象
责任链模式结构
1.抽象处理者
包含保证链传递的具体方法逻辑和具体处理者要实现的抽象方法
2.具体处理者
包含是否要处理请求的判断和处理的具体实现
责任链代码示例
1.抽象处理者
2.具体处理者
调用
结果
这样写还有什么问题呢?
我们发现在创建处理链时需要手动设置链顺序,这是非常不合理的存在,以后如果链上处理者增加减少或者链的处理顺序发生改变都需要改动这部分的代码。
所以我们需要动态构造处理链,方法有很多我这里提供一个思路。
1.维护一个保存了各个具体处理者包路径的枚举。
2.使用工厂方法规定传入参数,根据传入参数找到对应枚举,利用反射动态创建具体处理链,方法返回链的起点对象实例
这样我们使用链时便只用调用该工厂方法根据不同的传参动态创建链,再用返回的起点实例发起请求。