责任链模式
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
场景
我们有一个字符串String msg = ":):,<script>,敏感,被就业,网络授课";
我们希望应用以下三个规则对字符串进行过滤和谐处理:
-
将字符串中出现的
<>
符号替换成[
-
处理字符串中的敏感信息,将被就业和谐成就业
-
将字符串中出现的
:):
转换成^V^
;
字符串会依次运用这三条规则,对字符串进行处理,每个规则都有自己需要完成的责任和任务。
定义具有过滤功能的接口Filter
具体的过滤规则需要实现该接口
public interface Filter {
String doFilter(String str);
}
定义具体的过滤处理规则
规则一、处理字符串中的HTML标记HTMLFilter
public class HTMLFilter implements Filter {
@Override
public String doFilter(String str) {
//process the html tag <>
return str.replace('<', '[')
.replace('>', ']');
}
}
规则二、敏感字眼的过滤规则SesitiveFilter
public class SesitiveFilter implements Filter {
@Override
public String doFilter(String str) {
//process the sensitive words
String r = str.replace("被就业", "就业")
.replace("敏感", "");
return r;
}
}
规则三、FaceFilter
public class FaceFilter implements Filter {
@Override
public String doFilter(String str) {
return str.replace(":)", "^V^");
}
}
定义责任链FilterChain
public class FilterChain implements Filter {
List<Filter> filters = new ArrayList<Filter>();
public FilterChain addFilter(Filter f) {
this.filters.add(f);
return this;
}
public String doFilter(String str) {
String r = str;
for(Filter f: filters) {
System.out.println("调用类" + f.getClass().getName());
r = f.doFilter(r);
}
return r;
}
}
结束EndFilter
public class EndFilter implements Filter {
@Override
public String doFilter(String str) {
return str + "EndFilter";
}
}
Msg加工类MsgProcessor
public class MsgProcessor {
private String msg;
//Filter[] filters = {new HTMLFilter(), new SesitiveFilter(), new FaceFilter()};
FilterChain fc;
public FilterChain getFc() {
return fc;
}
public void setFc(FilterChain fc) {
this.fc = fc;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String process() {
return fc.doFilter(msg);
}
}
测试Main
public class Main {
public static void main(String[] args) {
String msg = "大家好:),<script>,敏感,被就业,网络授课没感觉,因为看不见大家伙儿";
MsgProcessor mp = new MsgProcessor();
mp.setMsg(msg);
//第一责任链
FilterChain fc = new FilterChain();
fc.addFilter(new HTMLFilter()).addFilter(new SesitiveFilter());
//第二责任链(相当于一个大的Filter)
FilterChain fc2 = new FilterChain();
fc2.addFilter(new FaceFilter()).addFilter(new EndFilter());
fc.addFilter(fc2);
mp.setFc(fc);
String result = mp.process();
System.out.println(result);
}
}
测试结果
调用类com.bjsxt.dp.filter.HTMLFilter
调用类com.bjsxt.dp.filter.SesitiveFilter
调用类com.bjsxt.dp.filter.FilterChain
调用类com.bjsxt.dp.filter.FaceFilter
调用类com.bjsxt.dp.filter.EndFilter
大家好^V^,[script],,就业,网络授课没感觉,因为看不见大家伙儿EndFilter
请求从前向后过滤,响应从后向前处理,参考https://www.cnblogs.com/ysw-go/p/5432921.html