责任链也可以叫做过滤器或者拦截器,只是不同的叫法而已,都是对当前的数据在使用前做相应的处理。
阶段一:
从简单的例子入手。问题描述:有一个字符串,需要对这个字符串做一些处理,然后输出。这里我定义了一个处理器MsgDealer,用来对字符串进行相应的处理,相应的代码如下:
Main:作为数据的入口
package chanOfResponsibility;
public class Main {
public static void main(String[] args) {
String msg = "java知识点好多,需要花好多时间精力去学。好像出去旅游。";
MsgDealer msgDealer = new MsgDealer();
msg = msgDealer.dealMsg(msg);
System.out.println(msg);
}
}
MsgDealer:字符串的处理类
package chanOfResponsibility;
public class MsgDealer {
public String dealMsg(String msg){
msg = msg.replaceAll("。", ";");
return msg;
}
}
现在如果我想要对这个字符串做进一步的处理,那么我就要修改MsgDealer的dealMsg方法,在里面再新加处理的代码就行了。比如我还想将所有的“多”替换成“*”,那么MsgDealer就变成如下:
package chanOfResponsibility;
public class MsgDealer {
public String dealMsg(String msg){
msg = msg.replaceAll("。", ";");
msg = msg.replaceAll("多", "*");
return msg;
}
}
如果这样的处理方式很复杂,而不是这么简单的一行代码,那么我们应该想办法将这段处理代码封装起来。新建一个接口如下:
package chanOfResponsibility;
public interface Filter {
public String doFilter(String msg);
}
实现类如下:
package chanOfResponsibility;
public class SymbolFilter implements Filter{
@Override
public String doFilter(String msg) {
msg = msg.replaceAll("。", ";");
return msg;
}
}
package chanOfResponsibility;
public class CharacterFilter implements Filter{
@Override
public String doFilter(String msg) {
msg = msg.replaceAll("多", "*");
return msg;
}
}
此时MsgDealer变成了:
package chanOfResponsibility;
public class MsgDealer {
public String dealMsg(String msg){
SymbolFilter symbolFilter = new SymbolFilter();
msg = symbolFilter.doFilter(msg);
CharacterFilter characterFilter = new CharacterFilter();
msg = characterFilter.doFilter(msg);
return msg;
}
}
此时MsgDealer的代码有些冗余,SymbolFilter与CharacterFilter都实现了Filter借口,它们两个组合起来就相当于一个过滤器链。先写一个简单的链,用数组将这两个过滤器放在一起,代码如下:
package chanOfResponsibility;
public class MsgDealer {
public Filter[] f = new Filter[]{new SymbolFilter(),new CharacterFilter()};
public String dealMsg(String msg){
for(Filter filter : f){
msg = filter.doFilter(msg);
}
return msg;
}
}
这样如果再新增一个filter,直接在f中再新增一个就行了,同时你还可以控制过滤器的先后次序。这其实就是个简单的责任链。
未完待续。。。
以上是个人观点,如有错误,欢迎指正。