在 面向对象程式设计里, 责任链模式是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。该模式还描述了往该处理链的末尾添加新的处理对象的方法。下面通过一个小例子来演示该模式。
首先我们先写一段测试程序。main.java 这个例子我们主要的操作是对一条字符串中的字符进行过滤和替换。
package com.flj.main;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
String msg = "大家好!敏感词,<>";
mainProcessor mp = new mainProcessor();
mp.setMsg(msg);
System.out.println(mp.process());
}
}
然后写一个执行操作的程序。
package com.flj.main;
public class mainProcessor {
private String msg;
Filter[] filters = {new Filter1(),new Filter2()};
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public String process(){
String r = msg;
for(Filter f : filters){
r = f.doFilter(r);
}
return r;
}
}
定义一个Filter接口类,里面定义一个doFilter()方法。
package com.flj.main;
public interface Filter {
public String doFilter(String str);
}
定义两个Filter的实现类。
package com.flj.main;
public class Filter1 implements Filter {
@Override
public String doFilter(String str) {
String r = str.replace("<", ":)")
.replace(">", "^^");
return r;
}
}
package com.flj.main;
public class Filter2 implements Filter {
@Override
public String doFilter(String str) {
String r = str.replace("大家好", "各位早上好啊");
return r;
}
}
最后执行我们的测试程序,结果如图
可以发现字符串“大家好!敏感词,<>”被替换成了“各位早上好啊!敏感词,:)^^”。
那么我们传统的写法是在mainProcessor类的process方法中把Filter1和Filter2的执行代码就写在一堆,如果要继续添加处理就往里面再继续添加代码,但是这样我们可以发现可别不灵活,那么采用上面的责任链编程思想呢,我们如果想要对字符串再进行操作,那么我们只需继续添加一个Filter的实现类,然后在mainProcessor类中让其依次执行即可,这是程序修改起来特别的方便,这就是责任链编程的好处。