管道过滤器模式 分布式

管道过滤器模式(Pipe and Filter)与组合模式(修改) 2010-07-12 21:51:08标签:Pipe and Filter Composite 组合模式 管道过滤器原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://haolloyin.blog.51cto.com/1177454/348277

之前在 benjielin前辈的博客中看到“管道过滤器(Pipe-And-Filter)模式(http://bj007.blog.51cto.com/1701577/345677)”,当时将文章中运用到的组合模式(Composite)与我刚刚写过的装饰模式(Decorator)和职责链模式(Chainof Responsibility)混为一谈,并希望用这后面两个模式进行代码实现,+_+

现在觉得还是先把那文章中的组合模式给具体实现一下吧,具体的文字描述请看上面文章链接哦。

在我的代码中,我假设的需求是:给定多个条件(即过滤器),遍历一本字典中的所有单词,将同时符合所有条件的所有单词查询(过滤)出来。现假定需要过滤出“单词中同时包含a、b、cd字串,并且以"end”结尾,最后是单词的长度大于7”。

好了,看清了需求,得出类图如下:

  1. //字典
  2. classDictionary{
  3. //字典里面有好多单词
  4. privateArrayList<String>allWords;
  5. publicDictionary(ArrayList<String>allWords){
  6. this.allWords=allWords;
  7. }
  8. //获取字典中所有单词
  9. publicArrayList<String>getAllWords(){
  10. returnthis.allWords;
  11. }
  12. }
  1. //过滤器接口,只有match()方法
  2. interfaceIFilter{
  3. publicbooleanmatch(Stringword);
  4. }
  1. //树叶型过滤器,过滤单词中长度大于指定长度
  2. classLengthFilterimplementsIFilter{
  3. privateintlength;
  4. publicLengthFilter(intlength){
  5. this.length=length;
  6. }
  7. @Override
  8. publicbooleanmatch(Stringword){
  9. if(word.length()>length){
  10. returntrue;
  11. }
  12. returnfalse;
  13. }
  14. }
  1. //树叶型过滤器,过滤单词中包含有某个字符字串
  2. classContainsFilterimplementsIFilter{
  3. privateStringsubStr;
  4. publicContainsFilter(StringsubStr){
  5. this.subStr=subStr;
  6. }
  7. @Override
  8. publicbooleanmatch(Stringword){
  9. if(word.contains(subStr)){
  10. returntrue;
  11. }
  12. returnfalse;
  13. }
  14. }
  1. //树叶型过滤器,过滤单词中以某个字符字串结束
  2. classEndFilterimplementsIFilter{
  3. privateStringsubStr;
  4. publicEndFilter(StringsubStr){
  5. this.subStr=subStr;
  6. }
  7. @Override
  8. publicbooleanmatch(Stringword){
  9. if(word.endsWith(subStr)){
  10. returntrue;
  11. }
  12. returnfalse;
  13. }
  14. }
  1. //抽象组合型过滤器,类似于树枝节点
  2. abstractclassCompositeFilterimplementsIFilter{
  3. protectedArrayList<IFilter>filters;
  4. publicCompositeFilter(){
  5. this.filters=newArrayList<IFilter>();
  6. }
  7. //继续将IFilter接口中的match()声明为abstract,
  8. //由具体的过滤器子类进行实现
  9. publicabstractbooleanmatch(Stringword);
  10. //添加过滤器链
  11. publicvoidaddFilters(ArrayList<IFilter>filters){
  12. this.filters.addAll(filters);
  13. }
  14. //添加一个过滤器
  15. publicvoidaddFilter(IFilterfilter){
  16. this.filters.add(filter);
  17. }
  18. //既然是树枝过滤器,其下必有子过滤器
  19. publicArrayList<IFilter>getFilters(){
  20. returnthis.filters;
  21. }
  22. }
  1. //and过滤器,树枝型过滤器
  2. classAndFilterextendsCompositeFilter{
  3. @Override
  4. publicbooleanmatch(Stringword){
  5. for(IFilterfilter:super.filters){
  6. if(!(filter.match(word))){
  7. returnfalse;
  8. }
  9. }
  10. returntrue;
  11. }
  12. }
  1. //or过滤器,树枝型过滤器
  2. classOrFilterextendsCompositeFilter{
  3. @Override
  4. publicbooleanmatch(Stringword){
  5. for(IFilterfilter:super.filters){
  6. if(filter.match(word)){
  7. returntrue;
  8. }
  9. }
  10. returnfalse;
  11. }
  12. }
  1. //管道
  2. classPipe{
  3. //字典,相当于流入管道的数据流
  4. privateDictionarydictionary;
  5. //用于保存过滤后的最终数据
  6. privateLinkedHashSet<String>theWords;
  7. //单词查询中需要用到的过滤器树
  8. privateIFilterfilterTree;
  9. //用于保存字典中的所有单词,即数据流中的一个个数据
  10. privateArrayList<String>allWords;
  11. publicPipe(Dictionarydictionary,IFilterfilterTree){
  12. this.dictionary=dictionary;
  13. this.filterTree=filterTree;
  14. this.theWords=newLinkedHashSet<String>();
  15. }
  16. publicLinkedHashSet<String>getWords(){
  17. //先搜索过滤字典中所有单词,再返回符合要求的单词集合
  18. this.allWords=dictionary.getAllWords();
  19. this.findWords();
  20. returnthis.theWords;
  21. }
  22. privatevoidfindWords(){
  23. //对每个单词进行过滤
  24. for(Stringword:allWords){
  25. if(filterTree.match(word)==true){
  26. this.theWords.add(word);
  27. }
  28. }
  29. }
  30. }
  1. //测试类
  2. publicclassClient{
  3. publicstaticvoidmain(String[]args){
  4. //创建过滤器树:包含"a"、"b"、"cd"子串,以"end"结尾,长度>7
  5. //同时包含"a"、"b"、"cd"子串的过滤器
  6. CompositeFilterandFilter=newAndFilter();
  7. IFiltercontain01=newContainsFilter("a");
  8. IFiltercontain02=newContainsFilter("b");
  9. IFiltercontain03=newContainsFilter("cd");
  10. andFilter.addFilter(contain01);
  11. andFilter.addFilter(contain02);
  12. andFilter.addFilter(contain03);
  13. //以"end"或"END"结尾的过滤器
  14. CompositeFilterorFilter=newOrFilter();
  15. IFilterend01=newEndFilter("end");
  16. IFilterend02=newEndFilter("END");
  17. orFilter.addFilter(end01);
  18. orFilter.addFilter(end02);
  19. //长度>7的过滤器
  20. IFilterlengthFilter=newLengthFilter(7);
  21. //构建过滤器树,用根过滤器将上面的所有过滤器组合起来
  22. CompositeFilterrootFilter=newAndFilter();
  23. rootFilter.addFilter(andFilter);
  24. rootFilter.addFilter(orFilter);
  25. rootFilter.addFilter(lengthFilter);
  26. //自定义一本字典里的所有单词
  27. ArrayList<String>allWords=newArrayList<String>();
  28. allWords.add("akkkk");
  29. allWords.add("ab--b-cd--end");
  30. allWords.add("abckk");
  31. allWords.add("abdcend");//长度为6,不符合
  32. allWords.add("kakbkck");
  33. allWords.add("a-b-cd-END");
  34. allWords.add("bbcc");
  35. //自定义一本字典
  36. Dictionarydictionary=newDictionary(allWords);
  37. //将字典、过滤器树传入管道
  38. Pipepipe=newPipe(dictionary,rootFilter);
  39. //单词流在通过管道时被过滤,获取最终单词
  40. System.out.println(pipe.getWords());
  41. }
  42. }

测试结果:

  1. [ab--b-cd--end,a-b-cd-END]

如此一来,基本上解决了我在原来文章中的许多疑问(下面的是修改前的内容),根据 benjielin前辈的提示,修改了原来完全不合理的地方,可看评论哦。

话说回来,原来的代码也太乱了,原因就是我完全理解错了benjielin 前辈文章中关于组合模式中AndFilter 类、OrFilter类的用处,也完全没弄明白组合模式究竟用于何处,呼...

小结:

1、Pipe 类中过滤的代码少了很多,只是调用过滤器的match() 方法而已;

2、由 1 也相应地去除了由 Pipe类来判断对象属于树叶还是树枝类型的逻辑,消去了坏味道;

3、原文中利用递归遍历过滤器树的方法一点都不合理,完全应该去除,当初是因为没理清思路;

4、改变主意,不用 职责链模式 来实现管道过滤器模式了,因为现在我觉得那个模式应该实现不了 Composite 模式这样的功能,它最多也只能起到 的作用。

我的相关文章:

组合模式(Composite)的安全模式与透明模式http://haolloyin.blog.51cto.com/1177454/347308

职责链模式(Chain ofResponsibility)的Java实现http://haolloyin.blog.51cto.com/1177454/342166

  

爱华网本文地址 » http://www.aihuau.com/a/25101011/99400.html

更多阅读

飞行模式怎么用WIFI? 飞行模式怎么开wifi

飞行模式怎么用WIFI?——简介Android手机的飞行模式就是一竿子关闭包括通讯、Wi-Fi、蓝牙和NFC在内的所有无线功能。但有时我们只需飞行模式的省电,却又希望单独开启Wi-Fi,此时应该如何设置呢?飞行模式怎么用WIFI?——工具/原料RE管理器

word只能用安全模式打开怎么办 word只能安全模式

?很多人在用word 时会出现 不能正常打开只能用安全模式打开,这是因为word的默认模板出了问题,要想解决这个问题,首先要查找找到normal.dot,(在C:Documents and SettingsAdministratorApplication DataMicrosoftTemplates下,),然后将它改名

CF幽灵模式 屋顶机场 陈子豪解说cf幽灵模式

CF(幽灵模式)屋顶机场——简介地图背景:保卫者派出一支精英部队深入Z国首都,搜集巨型生化兵器的最新情报。情报到手后,保卫者准备按计划,从大厦屋顶乘直升机秘密撤离。然而,潜伏者对这份情报似乎更感兴趣,潜伏者的刀战幽灵们已经接到了命令:

三国志11决战称霸模式 官渡之战攻略 三国志11官渡之战攻略

三国志11决战称霸模式 官渡之战攻略——简介曹操与袁绍的对决,决定了这两大阵营胜者为王败者为寇的关键一战,也决定了中原未来的发展局势;三国志11决战称霸模式 官渡之战攻略——方法/步骤三国志11决战称霸模式 官渡之战攻略 1、两

劲舞团代币模式怎么玩 劲舞团升级

劲舞团代币模式怎么玩——简介简介劲舞团代币模式怎么玩。劲舞团代币模式怎么玩——方法/步骤劲舞团代币模式怎么玩 1、?模式要求人数。? 至少三人劲舞团代币模式怎么玩 2、?代币种类。??分为蓝色、红色、绿色代币。劲舞团

声明:《管道过滤器模式 分布式》为网友大六汉子分享!如侵犯到您的合法权益请联系我们删除