设计模式之责任链模式
系列文章目录
第一篇:设计模式之观察者模式
第二篇:设计模式之代理模式
第三篇:设计模式之责任链模式
文章目录
- 系列文章目录
- 前言
- 一、责任链模式
-
-
- 实现一
- 实现二
-
前言
顾名思义,责任链模式就是一个和链路相关的模块,就像我们的请求,要经过多层拦截器,过滤器才能到达我们的业务层处理逻辑。说得通俗一点,就像我们的闯关游戏一样,需要一层一层来
何时使用:在处理消息或者对数据请求要经过很多道逻辑进行过滤的时候。
如何解决:拦截的类都实现统一接口。
提示:以下是本篇文章正文内容,将用两种方式实现责任链模式
一、责任链模式
例如,下面有一个用户,有两个过滤器,我们需要同时检查用户是否登录和用户名的长度是否大于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);}