什么是责任链? 我全部围绕着代码来写:
首先,我们经常在上网的时候会遇见这样的问题,你发出去一部分消息,但是在屏幕显示出来的跟你实际发送出去的有所差别,比如说在玩有些游戏的时候,你想骂人的时候,但是你会发现你的有部分会变为其它的,比如星号。因为在你发送消息出去之后,程序会检查你的消息时候包含敏感词汇,如果有,它会给你改了或者删除掉,我们今天就来介绍这种设计模式。
假如说MSG就是你发的消息,那么他就会经过一层一层的过滤,再返回回来。
现在假如说我们有这样一串字符串:
String mesg = "大家好:),<scip>, w我是你caca";
我们想把里面的 :) 替换成 ^v^ 。把 < > 替换成 [ ] 。 caca 替换成 ** 。
那么我们应该写 3 个Filter,
public class FaceFilter implements Filter {
@Override
public String doFilter(String str) {
return str.replace(":)", "^V^");
}
}
public class HTMLFilter implements Filter {
@Override
public String doFilter(String str) {
return str.replace("<", "[").replace(">", "]");
}
}
public class Sensitive implements Filter {
public String doFilter(String str) {
return str.replace("caca", "$$");
}
}
这里我们让他们其实先了一个共同的Filter接口。
在这里面,我们定义一个Filter数组,然后挨着调用,然后就可以调用了。
那么我们在想一个问题,这只是我们的一部分过滤器,如果我们还有其它的过滤器想加进来我们怎么处理?比如下面这种情况:
我们有一个新的过滤器想加紧去,那么我们该怎么设计?
那么我们再新建一个类,然后定义一个容器,定义一个方法,往里面存一些Filter,那么你要按什么顺序过滤,以及你想要加什么新的过滤器,那么你只要调用方法往里面加,然后挨着用就可以了。
import java.util.ArrayList;
import java.util.List;
public class FilterChain {
List<Filter> l = new ArrayList<Filter>();
public void AddFilter(Filter f){
l.add(f);
}
public String ChuLi(String s){
String str = s;
for(Filter fs : l){
str = fs.doFilter(str);
}
return str;
}
}
public class Main {
public static void main(String[] args) {
String mesg = "大家好:),<scip>, w我是你caca";
FilterChain fc = new FilterChain();
fc.AddFilter(new HTMLFilter());
fc.AddFilter(new FaceFilter());
fc.AddFilter(new Sensitive());
Process p = new Process();
p.setMesg(mesg);
p.setFc(fc);
System.out.println(p.Processor());
}
}
现在那么你想按什么顺序过滤或者加新的过滤器,只需要Add就可以了。
现在是一个消息从客户端发送到服务器端,一般的情况下服务器端还会返回一个消息到客户端,
那么,返回的经过的过滤器刚好和接收到的相反,那么我们该如何设计?我简单的说一下思想。
没错,看起来有点像递归。我们再把程序贴上结合起来看。
public interface Filter {
public void doFilter(Request request, Responce responce, FilterChain chian);
}
import java.util.ArrayList;
import java.util.List;
public class FilterChain {
List<Filter> l = new ArrayList<Filter>();
private int index = 0;
public void AddFilter(Filter f){
l.add(f);
}
public void ChuLi(Request request, Responce responce, FilterChain chian){
if(index == l.size()) return;
Filter f = l.get(index);
index++;
f.doFilter(request, responce, chian);
}
}
public class FaceFilter implements Filter {
public void doFilter(Request request, Responce responce, FilterChain chian) {
request.request = request.request.replace(":)", "^V^")
+ "---FaceFilter";
chian.ChuLi(request, responce, chian);
responce.responce += "---FaceFilter";
}
}
public class HTMLFilter implements Filter {
@Override
public void doFilter(Request request, Responce responce, FilterChain chian) {
request.request = request.request.replace("<", "[").replace(">", "]") + "---HTMLFilter";
chian.ChuLi(request, responce, chian);
responce.responce += "---HTMLFilter";
}
}
public class Sensitive implements Filter {
public String doFilter(String str) {
return str.replace("caca", "$$");
}
@Override
public void doFilter(Request request, Responce responce, FilterChain chian) {
request.request = request.request.replace("caca", "**") + "---Sentive";
chian.ChuLi(request, responce, chian);
responce.responce += "---Sentive";
}
}
public class Main {
public static void main(String[] args) {
String mesg = "大家好:),<scip>, w我是你caca";
FilterChain fc = new FilterChain();
fc.AddFilter(new HTMLFilter());
fc.AddFilter(new FaceFilter());
fc.AddFilter(new Sensitive());
Request rq = new Request();
rq.setRequest(mesg);
Responce rp = new Responce();
rp.setResponce("responce");
fc.ChuLi(rq, rp,fc);
System.out.println(rq.getRequest());
System.out.println(rp.getResponce());
}
}
我们的Reflect 和 Responce就简单封装了两个字符串,我们首先按照顺序调用第一个过滤器,让后执行到到Responce前面的时候调用下一个过滤器,然后依次下去,到最后再一层一层的返回,那么输出结果就为:
大家好^V^,[scip], w我是你**---HTMLFilter---FaceFilter---Sentive
responce---Sentive---FaceFilter---HTMLFilter