雅核的园子
丢下还是得捡回来

导航

 

责任链模式

(Chain of Responsibility Pattern)
责任链模式相信很多人在工作中也接触过。

  • javax.servlet.Filter
  • struts的拦截器
  • SpringMVC的拦截器
    那么,接下来我们来进行更加深入的、直观的了解。

讲解重点

  1. 责任链示例代码
  2. 链条与链条之间操作示范
  3. 自己实现简单的链式编程

定义

顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。
在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

上面的一大堆看不懂,那我们通过几个例子进行解析,看完例子相信,你可以直接用自己的话,解释什么是责任链模式

举个栗子

  • 父类接口Filter
/**
 * 为了实现filter链条的顺序执行依赖于上一个Filter的返回值
 * 修改Filter中的doFilter的返回类型为boolean
 */
interface Filter {
   boolean  doFilter(Msg msg);
}
  • 一系列过滤器

过滤器

  • 链条类
//过滤链
class FilterChain implements Filter {
    List<Filter> filters = new ArrayList<>(16);

    //直接返回FilterChain,再进行add时代码易读性增大(链式编程)
    public FilterChain add(Filter filter) {
        filters.add(filter);
        return this;
    }

    public void remove(Filter filter) {
        filters.remove(filter);
    }

    public boolean doFilter(Msg msg) {
        for (Filter filter : filters) {
           if(!filter.doFilter(msg)){
               return false;
           }
        }
        return true;
    }
}
  • 测试程序
public class Main {
    public static void main(String[] args) {
        Msg msg = new Msg();
        msg.setMsg("大家好:); <script> ,欢迎访问 taobao.com ,大家都是996");

        FilterChain filterChain = new FilterChain();
        filterChain.add(new HtmlFilter()).add(new SensitiveFilter());

        FilterChain filterChain2 = new FilterChain();
        filterChain2.add(new EmjogFilter()).add(new UrlFilter());
/**
 *  让FilterChain实现Filter接口,这个链条也可以当作是一个Filter加到别的链条上去
 */
        filterChain.add(filterChain2);

        filterChain.doFilter(msg);
        System.out.println(msg);
    }
}
  • 输出
    输出示例

结语

测试程序中将过滤器,分别放到了两个FilterChain.
其一:演示责任链的工作流程
其二:演示链条与链条之间的处理
这样就通过责任链模式,简单的实现了过滤操作。

posted on 2020-06-12 11:27  雅核  阅读(166)  评论(0编辑  收藏  举报