> 文档中心 > 设计模式之责任链模式

设计模式之责任链模式


系列文章目录

第一篇:设计模式之观察者模式
第二篇:设计模式之代理模式
第三篇:设计模式之责任链模式


文章目录

  • 系列文章目录
  • 前言
  • 一、责任链模式
      • 实现一
      • 实现二

前言

顾名思义,责任链模式就是一个和链路相关的模块,就像我们的请求,要经过多层拦截器,过滤器才能到达我们的业务层处理逻辑。说得通俗一点,就像我们的闯关游戏一样,需要一层一层来

设计模式之责任链模式

何时使用:在处理消息或者对数据请求要经过很多道逻辑进行过滤的时候。

如何解决:拦截的类都实现统一接口。


提示:以下是本篇文章正文内容,将用两种方式实现责任链模式

一、责任链模式

例如,下面有一个用户,有两个过滤器,我们需要同时检查用户是否登录和用户名的长度是否大于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);}