什么是责任链模式?
责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送,直到有一个处理者能够处理该请求。这种模式可以帮助你将请求的发送者和接收者解耦,并允许多个对象处理该请求。
责任链模式如何实现?
在责任链模式中,有一个发送者 (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接口,并加入定义的链中则可以完成对内容的信息过滤和屏蔽。