责任链模式,顾名思义,就是将需要实现的功能,拆分为各自专一的责任,组成一条责任链,来完成对数据的处理。
先看下面一段demo
需要被处理的对象类
@Data
public class User {
private String name;
private int age;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
责任处理器接口
public interface Filter {
void doFilter(User target, Chain chain);
}
责任处理器的两个接口
public class FirstFilter implements Filter {
@Override
public void doFilter(User user, Chain chain) {
//此处对需要处理的对象进行处理,完成自己的责任,完成之后还需要传给责任链中的下一位
user.setAge(1);
System.out.println("经过第一个处理器");
chain.doFilter(user);
}
}
public class SecondFilter implements Filter {
@Override
public void doFilter(User user, Chain chain) {
//实现自己的责任
user.setName("jungle");
System.out.println("经过第二个处理器");
//传递
chain.doFilter(user);
}
}
责任链接口
public interface Chain {
void doFilter(User target);
}
责任链实现类
public class FilterChain implements Chain {
private List<Filter> filters = new ArrayList();
private int pos = 0;
public FilterChain() {
filters.add(new FirstFilter());
filters.add(new SecondFilter());
}
@Override
public void doFilter(User user) {
if (pos < filters.size()){
Filter filter = filters.get(pos++);
filter.doFilter(user, this);
}
}
public static void main(String[] args) {
User user = new User();
new FilterChain().doFilter(user);
System.out.println(user);
}
}
运行结果
经过第一个处理器
经过第二个处理器
User{name='jungle', age=1}
以上责任链主要实现了两个功能,第一个处理器对user对象的年龄进行处理,第二个处理器对user对象的名字进行处理,可以看到,在对象走完整个责任链之后,对象的属性被初始化,整个责任链完成了自己的责任。在整个链中,每个处理器只需要完成自己负责的逻辑,完成之后便像工厂流水线一样传递到下一个处理器中,遵循了软件中高内聚,低耦合的思想,是一种非常经典的设计模式,一个非常经典的案例便是web应用服务器中的过滤器(Filter)。
tomcat中的责任链,我们常说的过滤器,即是使用的责任链设计模式,主要负责处理解析出来的request和response对象
接口
链的实现类
责任链处理完之后,抛个sevlet执行业务
以上便是责任链模式的所有内容,希望各位看完之后能有所收获。