`

设计模式----责任链模式

 
阅读更多

一、前话

        因为想要实现一个简单过滤的功能,又加上过滤的类别比较多。当时第一次写的时候我把方法里面写了好多个list参数,一次性实现过滤,但是感觉太凌乱了、感觉好别扭、并且额外添加一些过滤的修改也很麻烦,要改很多东西。然后就百度了很多,觉得用责任链这个去实现过滤我觉得挺好的。想做个笔记吧,欢迎吐槽

 

二、责任链的理解

       责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求,或者处理到最后。这使得可以动态地重新组织和分配责任。

        我理解链有这些特性:1.有下环的一个链接。

                                            2.链接可以随意的组合(组合很灵活),也可以随意的切断了。

 

                                   优点:这样的话我觉得整个流程很清晰,扩展和组织我觉得也很好

                                   缺点:当链条长的话中间可能有一部分是没用的,配置也可以形成死链

 

三、文件过滤的链条

        我的基本思路是:1.遍历所有的文件得到一个list

                                                                  |

                                     2.过滤得到一些匹配后缀文件

                                                                  |

                                     3.过滤得到一些日期范围

                                                                  |

                                        .............版本信息、其他的一些属性......................

 ==============================================================

我的这个链是一走到底。(过滤顺序可以随便配置了)

但是过滤的属性内容有时候不定:例如后缀了这些”.exe/.txt"并且属性是动态的

当时想通过xml配置过滤类路径去反射,动态的过滤配置的?但是实例化参数感觉不好弄,就先放下了。

这算是第一次真正的去找一个设计模式实现想要的东西。                                                

        1.定义了一个抽象类

public abstract class FindFiles{
private FindFiles    nextFilter;
//next的get/set方法
public FindFiles getNextFilter(){return ..}
public void getNextFilter(){..}
//判断next是否存在
public bool isNext(){nextFilter==null?false:true;}
//主方法
public abstract List<T>getMatchFileList(List<T> fileList);
}

     2.就是属性继承了实现方法

public SuffixsFilter extends FindFiles{

private List<string>suffixList;
get/set
public List<T>getMatchFileList(List<T> fileList){

         
       1.把不符合要求的移除掉。
       2.if(isNext()){
                 return nextFilter.getMatchFileList(..);
     }else{
                return fileList;
   }
}
}

 好处:想在添加新的过滤方案可以立即加进去,要改动的地方就很少了。

四、处理情况

因为用的可能是过滤情况,所以处理就一路狂奔了。

另一些要求例如权限等级的访问等也可以这样处理:当前能处理的就处理,处理不了的往下(级别高)发送中间充当一个传达的作用。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics