一、前话
因为想要实现一个简单过滤的功能,又加上过滤的类别比较多。当时第一次写的时候我把方法里面写了好多个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;
}
}
}
好处:想在添加新的过滤方案可以立即加进去,要改动的地方就很少了。
四、处理情况
因为用的可能是过滤情况,所以处理就一路狂奔了。
另一些要求例如权限等级的访问等也可以这样处理:当前能处理的就处理,处理不了的往下(级别高)发送中间充当一个传达的作用。