理论写着写着就明白了
应用场景
- 过滤器Filter 拦截器Interceptor
- 解耦合 | 增加扩展性
先来上个图
大家看啊,我现在要完成这样一个事情:刚起床的我要洗漱,穿衣服,吃饭,上班,我们实现可以写一个洗漱的filter完事之后再来一个穿衣服的filter然后再来一个吃饭的filter最后再来一个上班的fiter,那么我以后再这个基础上还要加开会,得奖金,娶媳妇儿,生孩子等等这一系列呢?我们可以每次增加一个新的filter然后再我的main里面new出来再给我人进行filter(),但是这样就太过麻烦了,随着你逻辑的增加,你修改的代码量就越来越多,那么怎么解决这种问题呢,这就引出了我们今天的主角 ---- 责任链:
大家看这个图像不像一个链条,把我们要做的事情全部串联再一起,我们只需要从这个链条中走出来,就完成了我们需要做的事情。
再来上个代码
public class Main {
public static void main(String[] args) {
Msg msg = new Msg();
msg.setMsg("大家好:),<script>, 欢迎访问 wozhenshuai.com , 愿大家都是955");
/*Filter1 f1 = new Filter1();
f1.doFilter(msg);
Filter2 f2 = new Filter2();
f2.doFilter(msg);*/
/*List<Filter> fl = new ArrayList<>();
fl.add(new Filter1());
fl.add(new Filter2());
for (Filter f :
fl) {
f.doFilter(msg);
}*/
FilterChain fc = new FilterChain();
fc.add(new Filter1())
.add(new Filter2());
FilterChain fc1 = new FilterChain();
fc1.add(new Filter3())
.add(new Filter4());
fc.add(fc1);
fc.doFilter(msg);
System.out.println(msg.getMsg());
}
}
class Msg{
String name;
String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "Msg{" +
"name='" + name + '\'' +
", msg='" + msg + '\'' +
'}';
}
}
interface Filter{
boolean doFilter(Msg msg);
}
class Filter1 implements Filter{
@Override
public boolean doFilter(Msg msg) {
String r = msg.getMsg();
r = r.replace('<', '[');
r = r.replace(">","]");
msg.setMsg(r);
return true;
}
}
class Filter2 implements Filter{
@Override
public boolean doFilter(Msg msg) {
String r = msg.getMsg();
r = r.replaceAll("955", "996");
msg.setMsg(r);
return false;
}
}
class Filter3 implements Filter{
@Override
public boolean doFilter(Msg msg) {
String r = msg.getMsg();
r = r.replace(":)", "||");
msg.setMsg(r);
return true;
}
}
class Filter4 implements Filter{
@Override
public boolean doFilter(Msg msg) {
String r = msg.getMsg();
r = r.replace("fujiqiu.com", "www.fujiqiu.com");
msg.setMsg(r);
return true;
}
}
class FilterChain implements Filter{
List<Filter> fl = new ArrayList<>();
public FilterChain add(Filter f){
fl.add(f);
return this;
}
@Override
public boolean doFilter(Msg msg) {
for (Filter f :
fl) {
if(!f.doFilter(msg)) return false;
}
return true;
}
}
我上面这段代码完成了一段字符串替换的功能,这里主要说一下为什么返回boolean值:我上面说到,我们只要走完这个链条就能完成我们相应的需求,那么问题来了,如果我因为某些特殊的原因不能沿着链条走下去了怎么办,我们是不是要告诉责任链我不能走这条路了,你得让我出去!我们这里加这个boolean的返回值就是为了解决这个问题的当我这个字符串里面存在我明确不能解析的符号时,我返回false,这样在doFilter中就不会在继续向下执行。