23种设计模式-责任链模式(java)

107 阅读2分钟

什么是责任链模式?

责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送,直到有一个处理者能够处理该请求。这种模式可以帮助你将请求的发送者和接收者解耦,并允许多个对象处理该请求。

责任链模式如何实现?

在责任链模式中,有一个发送者 (sender),多个处理者 (handler) 和一个接收者 (receiver)。发送者发送请求给处理者链,处理者链中的每个处理者都会尝试处理请求,直到请求被处理或者处理者链中没有可以处理请求的处理者。请求在沿着处理者链发送时,每个处理者都可以决定是否处理请求,如果他们无法处理请求,则他们将请求传递给下一个处理者,直到请求到达接收者。接收者是请求的最终处理者,他们可以处理请求并将其返回给发送者。

责任链模式的优点是什么?

它允许你将请求的发送者和接收者解耦,并允许多个对象处理该请求。它还可以提高代码的可重用性和可维护性,因为你可以轻松地添加或删除处理者。

案例

在博客下留言保存的时候,需要对内容数据进行过滤和屏蔽,一个是防止脚本注入,还有一个是特殊词汇需需要屏蔽掉。简单的方法如下

public class Word {

    String msg;

    public Word() {
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public static void main(String[] args) {
        Word word = new Word();
        word.setMsg("这个人真的是牛b<script> href='www.12321231.com'>");
        String msg = word.getMsg();
        msg = msg.replace("<", "[");
        msg = msg.replace(">","]");
        msg = msg.replace("牛b", "**");

        System.out.println(msg);

    }
}

这个就是简单的实现,通过增加内部逻辑,替换掉字符的信息。但是这个就会遇到扩展的问题,不方便后续的过滤规则扩展,即使能够在过滤的规则增加方法,会导致逻辑越来越复杂。如果使用责任链模式,则会改善很多。

public interface WorldChainStrategy {
     String wordFilter(String msg);
}
public class LanguageWorldChainStrategy implements WorldChainStrategy {

    @Override
    public String wordFilter(String msg) {
        msg = msg.replace("牛b", "**");
        return msg;
    }
}
public class KeyWorldChainStrategy implements WorldChainStrategy {

    @Override
    public String wordFilter(String msg) {
        msg = msg.replace("<", "[");
        msg = msg.replace(">","]");
        return msg;
    }
}
public class WorldChainFilter implements WorldChainStrategy {
     List<WorldChainStrategy> worldChainStrategies = new ArrayList<>();

     @Override
     public String wordFilter(String msg) {
          for (WorldChainStrategy worldChainStrategy : worldChainStrategies) {
              msg = worldChainStrategy.wordFilter(msg);
          }
          return msg;
     }


     public static void main(String[] args) {
          WorldChainFilter worldChainFilter = new WorldChainFilter();
          List<WorldChainStrategy> worldChainStrategies = new ArrayList<>();
          worldChainStrategies.add(new KeyWorldChainStrategy());
          worldChainStrategies.add(new LanguageWorldChainStrategy());
          worldChainFilter.worldChainStrategies = worldChainStrategies;
          String msg = worldChainFilter.wordFilter("这个人真的是牛b<script> href='www.12321231.com'>");
          System.out.println(msg);
     }


}

后续的扩展只需要实现WorldChainStrategy接口,并加入定义的链中则可以完成对内容的信息过滤和屏蔽。