首先要明确:用责任链模式的好处就是分工明确,解耦,容易维护。
-
将多个处理流程分散到各个的处理类上,耦合性相对较低。
-
增加一个具体的
新
处理类,不会影响到其他处理类的代码
责任链模式的缺点:
-
项目里边会有多个处理类(因为每种处理都抽象为一个类,所以会有多个类)
-
不好调试,初看代码时不好阅读。
再讲一下常见的责任链模式应用,就是Interceptor拦截器
如果我们要对某个信息进行过滤,一般会选择将过滤逻辑全写在HandlerInterceptor中,如果过滤条件少并且后期改动频率少的话是没什么大问题的
但是如果随着时间推移,有更多的过滤条件要加入进来,此时你就会发现HandlerInterceptor中的密密麻麻一大堆的判断逻辑耦合度实在太高了,很难进行后期的维护,所以基于这种情况责任链模式就登场了
再次明确一下:责任链模式并不能减少增加、删除、更改逻辑时的代码量,其目的只是为了解耦、易于维护、明确各部分责任
改造时,需要向上抽象出一个接口,提供过滤方法
并针对各种过滤逻辑提供对应的接口实现
以下代码代表 一个接口 与 对应的四个过滤实现
public interface Filter {
// 过滤
void doFilter(String data);
}
class FilterEgg implements Filter {
@Override
public void doFilter(String data) {
//doSomething
}
}
class FilterAoBing implements Filter {
@Override
public void doFilter(String data) {
//doSomething
}
}
class FilterBaiCai implements Filter {
@Override
public void doFilter(String data) {
//doSomething
}
}
class FilterJiTou implements Filter {
@Override
public void doFilter(String data) {
//doSomething
}
}
上面这些过滤逻辑的实现可以理解为彼此独立的一小段链条
接下来需要把这些彼此独立的小段链条串起来,形成一个完整的过滤长链就可以了
public class FilterChain {
List<Filter> filters = new ArrayList<>();
public FilterChain() {
filters.add(new FilterEgg());
filters.add(new FilterAoBing());
filters.add(new FilterBaiCai());
filters.add(new FilterJiTou());
}
public void processData(String data) {
for (Filter filter : filters) {
filter.doFilter(data);
}
}
}
如上,类FilterChain作用就是将小段链条串起来,此时FilterChain就代表了过滤链
此时,在HandlerInterceptor中只需要调用FilterChain的过滤方法就可以完成过滤
可以看到责任链模式并不能简化代码的书写,甚至会增加代码量,但是它可以使得各部分分工明确,用来解耦最好不过了,而且这总写法非常的优雅不是吗?