系列文章目录
第一篇:设计模式之观察者模式
第二篇:设计模式之代理模式
第三篇:设计模式之责任链模式
第四篇:设计模式之建造者模式
前言
顾名思义,责任链模式就是一个和链路相关的模块,就像我们的请求,要经过多层拦截器,过滤器才能到达我们的业务层处理逻辑。说得通俗一点,就像我们的闯关游戏一样,需要一层一层来
何时使用:在处理消息或者对数据请求要经过很多道逻辑进行过滤的时候。
如何解决:拦截的类都实现统一接口。
提示:以下是本篇文章正文内容,将用两种方式实现责任链模式
一、责任链模式
例如,下面有一个用户,有两个过滤器,我们需要同时检查用户是否登录和用户名的长度是否大于20
实现一
定义过滤器接口
public interface Filter {
void doFilter(User s);
}
定义登录过滤器实现类
public class LoginFilter implements Filter {
@Override
public void doFilter(User u) {
System.out.println("Filter1" + (u.getState() == 1 ? "登录" : "未登录"));
}
}
定义长度过滤器实现类
public class LengthFilter implements Filter{
@Override
public void doFilter(User u) {
if (u.getName().length() > 20) System.out.println("Filter2" + "长度大于20");
else System.out.println("Filter2" + "长度不大于20");
}
}
定义过滤器责任链
public class FilterChain implements Filter{
List<Filter> filterList = new ArrayList<>();
public FilterChain add(Filter filter){
filterList.add(filter);
return this;
}
@Override
public void doFilter(User user, FilterChain chain) {
for (Filter x : filterList) {
x.doFilter(s);
}
}
}
测试
public static void main(String[] args) {
FilterChain chain = new FilterChain();
chain.add(new LoginFilter()).add(new LengthFilter());
User user = new User();
user.setName("这是一个测试责任链模式的程序*");
user.setState(0);
chain.doFilter(user);
}
实现二
定义过滤器接口
public interface Filter {
void doFilter(User user, FilterChain chain);
}
定义登录过滤器实现类
public class LoginFilter implements Filter {
@Override
public void doFilter(User u, FilterChain chain) {
System.out.println("Filter1" + (u.getState() == 1 ? "登录" : "未登录"));
chain.doFilter(u,chain);
}
}
定义长度过滤器实现类
public class LengthFilter implements Filter{
@Override
public void doFilter(User u, FilterChain chain) {
if (u.getName().length() > 20) System.out.println("Filter2" + "长度大于20");
else System.out.println("Filter2" + "长度不大于20");
chain.doFilter(u,chain);
}
}
定义过滤器责任链
public class FilterChain implements Filter{
int index = 0;
List<Filter> filterList = new ArrayList<>();
public FilterChain add(Filter filter){
filterList.add(filter);
return this;
}
@Override
public void doFilter(User user, FilterChain chain) {
if (index == filterList.size()){
return;
}
Filter filter = filterList.get(index);
index++;
filter.doFilter(user,chain);
}
}
测试
public static void main(String[] args) {
FilterChain chain = new FilterChain();
chain.add(new LoginFilter()).add(new LengthFilter());
User user = new User();
user.setName("这是一个测试责任链模式程序");
user.setState(1);
chain.doFilter(user,chain);
}