首页 > 其他分享 >设计模式学习(十六):责任链模式

设计模式学习(十六):责任链模式

时间:2022-11-12 14:46:03浏览次数:63  
标签:Filter 十六 责任 Msg content msg 设计模式 public

设计模式学习(十六):责任链模式

作者:Grey

原文地址:

博客园:设计模式学习(十六):责任链模式

CSDN:设计模式学习(十六):责任链模式

责任链模式

责任链模式是一种行为型模式。

举例说明:有一段文本需要过滤一系列敏感字,我们可以通过责任链模式来设计这个功能,假设文本是

scripts Hell World! 996

我们有多个过滤规则,比如第一个规则是:过滤 scripts 这个关键字(实际的规则可能很复杂,目前只是举这个简单例子来说明情况)
第二个规则是:过滤 996 这个关键字

首先,将这个文本封装成一个 Msg 类,文本内容存在 content 变量中

public class Msg {
    private String content;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

然后,可以抽象一个 Filter 接口,各种过滤规则无非就是实现这个接口即可

public interface Filter {
    boolean doFilter(Msg msg);
}

过滤掉 996 这个关键字的规则:

public class SensitiveFilter implements Filter {
    @Override
    public boolean doFilter(Msg msg) {
        msg.setContent(msg.getContent().replace("996", ""));
        return true;
    }
}

过滤 scripts 的规则:

public class HTMLFilter implements Filter {
    @Override
    public boolean doFilter(Msg msg) {
        msg.setContent(msg.getContent().replace("scripts", ""));
        return true;
    }
}

主方法调用的时候,就直接 New 相应的 Filter 来处理即可:

Msg msg=new Msg();
msg.setContent("scripts Hell World! 996");
System.out.println("before filter , the content is : "+msg.getContent());
Filter html=new HTMLFilter();
Filter sensitive=new SensitiveFilter();
html.doFilter(msg);
sensitive.doFilter(msg);
System.out.println("after filter , the content is : "+msg.getContent());

不过,更为优雅的一种方式是设计一个 FilterChain ,把所有的 Filter 都加入到这个 FilterChain 里面,对于 Msg 直接去调用 FilterChain 的过滤方法即可把 FilterChain 中的所有 Filter 都执行,而且还可以很灵活指定 Filter 顺序。

import java.util.*;
public class FilterChain implements Filter {
    private List<Filter> filters = new ArrayList<>();

    public FilterChain addFilter(Filter filter) {
        filters.add(filter);
        return this;
    }

    @Override
    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) {
        FilterChain filterChain = new FilterChain();
        filterChain.addFilter(new HTMLFilter()).addFilter(new SensitiveFilter());
        Msg msg = new Msg();
        msg.setContent("scripts Hell World! 996");
        System.out.println("before filter , the content is : " + msg.getContent());
        filterChain.doFilter(msg);
        System.out.println("after filter , the content is : " + msg.getContent());
    }
}

上述示例的 UML 图如下

image

责任链模式应用

  • Java 中的 Servlet filter;

  • Structs,Spring MVC 中的 interceptor;

  • Dubbo 中的 Filter;

  • Netty 中的 ChannelPipeline。

UML 和 代码

UML 图

代码

更多

设计模式学习专栏

参考资料

标签:Filter,十六,责任,Msg,content,msg,设计模式,public
From: https://www.cnblogs.com/greyzeng/p/16883721.html

相关文章

  • 设计模式学习(十五):策略模式
    设计模式学习(十五):策略模式作者:Grey原文地址:博客园:设计模式学习(十五):策略模式CSDN:设计模式学习(十五):策略模式策略模式策略模式是一种行为型模式,它定义了一组算法,将每个......
  • docker实战教程(十六):mysql主从复制docker版
    新建主服务器容器实例3307dockerrun-p3307:3306--namemysql-master-v/mydata/mysql-master/log:/var/log/mysql-v/mydata/mysql-master/data:/var/lib/mysql-v......
  • 设计模式-建造者模式
    在我们生活中的对象比如汽车,它是由车轮、车架、发动机等组合起来的对象,但是往往使用的人只想要一辆汽车并不想知道创建汽车的过程此时就可以使用建造者模式。在软件开发中,也......
  • 设计模式学习(十四):模板方法
    设计模式学习(十四):模板方法作者:Grey原文地址:博客园:设计模式学习(十四):模板方法CSDN:设计模式学习(十四):模板方法模板方法模板方法是一种行为型模式。假设我们要实现一个游......
  • Android实战简易教程-第五十六枪(模拟美团客户端进度提示框)
    用过美团客户端的朋友都知道,美团的加载等待提示很有意思,是一种动画的形式展现给我们,下面我们就对这背后的原理进行了解,然后实现自己的等待动画效果。首先我们准备两张图片:这......
  • Java静态代理设计模式模式(多线程Runnable)
    静态代理设计模式,就是代理对象来帮你忙前忙后,你负责出席一下就好了。需要:1.实现相同的接口2.真实角色3.代理角色,里面有一个成员是接口对象(实际上是真实角色----接口实......
  • 设计模式学习(十三):观察者模式
    设计模式学习(十三):观察者模式作者:Grey原文地址:博客园:设计模式学习(十三):观察者模式CSDN:设计模式学习(十三):观察者模式观察者模式观察者模式是一种行为型模式。在对象之间......
  • C#设计模式之建造者模式
      原文网址:https://www.jb51.net/article/254976.htm场景:我们的冒险家,现在需要去武器商店买一把兵器,有刀和剑两种武器,冒险者可以告诉武器商人需要哪一种武器,然后武器商......
  • 软件设计模式白话文系列(六)代理模式
    1、描述代理模式属于结构型模式中的一种,通过对代理对象的调用来达到对原对象的增强、减弱作用。通过代理类的生成时机,我们将编译期就生成代理类的情况称之为静态代理模式,......
  • Android实战简易教程-第四十六枪(自定义控件体验之罗盘)
    前言作为一名有创新意思的开发人员,你迟早会发现内置的控件会满足不了你的想象力。拥有扩展已存在的视图、组建复合的控件以及创建独特的新视图能力,可以创建出最适合自己应用......