0
点赞
收藏
分享

微信扫一扫

用责任链方式来挑选单词


题目如下::

        给定若干个单词,选出符合以下条件的单词;

        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

上面的方法似乎不错, 但是还有一种更好的办法 就是利用管道模式 来处理这个问题.

下一次 咱们再谈谈管道模式


参考资料

​​管道过滤器模式(Pipe and Filter)与组合模式​​



举报

相关推荐

0 条评论