用责任链方式来挑选单词

来源:互联网 发布:如何测试sql注入 编辑:程序博客网 时间:2024/05/16 18:30

题目如下::

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

        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;}@Overridepublic 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 0
原创粉丝点击