您的位置:首页 > 编程语言 > Java开发

java设计模式--责任链(一)

2017-12-22 11:13 330 查看
责任链也可以叫做过滤器或者拦截器,只是不同的叫法而已,都是对当前的数据在使用前做相应的处理。

阶段一:

从简单的例子入手。问题描述:有一个字符串,需要对这个字符串做一些处理,然后输出。这里我定义了一个处理器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来将字符串中的“。”改成了“;”。
现在如果我想要对这个字符串做进一步的处理,那么我就要修改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中再新增一个就行了,同时你还可以控制过滤器的先后次序。这其实就是个简单的责任链。

未完待续。。。

以上是个人观点,如有错误,欢迎指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: