用责任链方式来挑选单词
来源:互联网 发布:如何测试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
- 用责任链方式来挑选单词
- 用sql代码集合方式挑选质数、素数
- 挑选
- 挑选
- 责任链的三种实现方式比较
- 责任链模式实现的三种方式
- 用CSV方式重写挑选仪器起止编号的Python程序
- 责任链
- 责任链
- 责任链
- 责任链
- 责任链
- 责任链
- 责任链
- 责任链
- 单词来了!
- 用责任链模式写注册逻辑
- 责任链及表驱动责任链
- Android:Activity+Fragment及它们之间的数据交换(一)
- (译)在cocos2d里面如何使用Texture Packer和像素格式来优化spritesheet
- 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法
- [Ajax 完整教程]-第 4 页 利用 DOM 进行 Web 响应
- startbbs中去掉index.php
- 用责任链方式来挑选单词
- ios 动画浅析
- jar包介绍
- 19岁创业富豪
- 精通安卓性能优化-第一章(五)
- TQ2440按键驱动1
- 基于MATLAB的dijkstra算法及其应用
- AMD OpenCL例子阅读笔记系列之Radix_Sort(三)
- 处理器大小端