题目如下::
给定若干个单词,选出符合以下条件的单词;
1:包含ss
2:包含a
3:以ks结尾.
如果你想的是一个for循环,然后是一个if(...&&...&&)那就不用说了 这些代码怎么维护?
如果新加一种判定条件,例如要长度大于7
再或者我想吧条件1改成包含kk.
所以就引入了下面这个方法 用责任链的方式来处理 代码如下
package searchword;
public abstract class Filter {
protected Filter successor;
public void setFilter(Filter successor){
this.successor=successor;
}
public abstract void execu(String text);
}
package searchword;
public class IsContain extends Filter {
private String word;
public IsContain(String word) {
this.word = word;
}
/**
* @param text 要判定的单词
*
*/
public void execu(String text) {
if (text.indexOf(word) >= 0) {
if (this.successor != null)
this.successor.execu(text);
else {
System.out.println(text);
}
}
}
}
package searchword;
public class IsEnd extends Filter{
private String word;
public IsEnd(String word){
this.word=word;
}
/**
* @param text 要判定的单词
*
*/
public void execu(String text) {
if(text.endsWith(word))
if(this.successor!=null)
this.successor.execu(text);
else {
System.out.println(text);
}
}
}
package searchword;
import java.util.ArrayList;
import java.util.List;
public class Client {
public static void main(String[] args) {
List<String> wordsList=new ArrayList<String>();
wordsList.add("asdfds");
wordsList.add("ssakkendks");
Filter isContainSS=new IsContain("ss");
Filter isContainA =new IsContain("a");
Filter endKs =new IsEnd("ks");
isContainSS.setFilter(isContainA);
isContainA.setFilter(endKs);
for (int i = 0; i < wordsList.size(); i++) {
isContainSS.execu(wordsList.get(i));
}
}
}
测试结果如下
ssakkendks
责任链的优势在于避免将请求发送者与接收者耦合在一起,让多个对象都有机会接收请求,,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止,
我们似乎大功告成了,但是又有新的问题,上面的各个条件之间的关系是与 如果我想再加一个条件 单词以end结尾或者以ks结尾 如何? 代码怎么改?
有一种思路 那就是
package searchword;
import java.util.List;
public class OrIsEnd2 extends Filter {
private List<String> words;
public OrIsEnd2(List<String> words) {
this.words = words;
}
@Override
public void execu(String text) {
for (int i = 0; i < words.size(); i++)
if (text.endsWith(words.get(i)))
if (this.successor != null)
this.successor.execu(text);
else
System.out.println(text);
}
}
package searchword;
import java.util.ArrayList;
import java.util.List;
public class Client {
public static void main(String[] args) {
List<String> wordsList=new ArrayList<String>();
wordsList.add("asdfds");
wordsList.add("ssakkendks");
wordsList.add("ssakkendbb");
wordsList.add("ssakkendbbsdf");
Filter isContainSS=new IsContain("ss");
Filter isContainA =new IsContain("a");
List<String> ssList=new ArrayList<String>();
ssList.add("ks");
ssList.add("bb");
Filter endKsOrBb =new OrIsEnd2(ssList);
isContainSS.setFilter(isContainA);
isContainA.setFilter(endKsOrBb);
for (int i = 0; i < wordsList.size(); i++) {
isContainSS.execu(wordsList.get(i));
}
}
}
测试结果
ssakkendks
ssakkendbb
上面的方法似乎不错, 但是还有一种更好的办法 就是利用管道模式 来处理这个问题.
下一次 咱们再谈谈管道模式
参考资料