用责任链方式来挑选单词

网友投稿 567 2022-11-26

用责任链方式来挑选单词

用责任链方式来挑选单词

题目如下::

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

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 wordsList=new ArrayList(); 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 words; public OrIsEnd2(List 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 wordsList=new ArrayList(); wordsList.add("asdfds"); wordsList.add("ssakkendks"); wordsList.add("ssakkendbb"); wordsList.add("ssakkendbbsdf"); Filter isContainSS=new IsContain("ss"); Filter isContainA =new IsContain("a"); List ssList=new ArrayList(); 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)与组合模式​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:跨域造成原因和解决方法
下一篇:ReentrantReadWriteLock读写锁的使用1
相关文章

 发表评论

暂时没有评论,来抢沙发吧~