我有一个测试任务。我必须创建责任链来搜索文件系统中的文件。例如,一个单元必须检查文件的名称和其他一个检查文件的大小范围。
如果我像这样使用java8 Predicate:
1)为返回谓词的链单元定义工厂方法。
public static Predicate<File> sizeGreaterThan(long size) {
return file -> file.getTotalSpace() >= size;
}
public static Predicate<File> sizeLessThan(long size) {
return file -> file.getTotalSpace() <= size;
}
2)将谓词与'和'结合起来
public class Filter<T> {
private Predicate<T> filter;
public boolean test(T file) {
return filter.test(file);
}
public void appendFilter(Predicate<T> additionFilter) {
if (Objects.isNull(filter)) {
filter = additionFilter;
} else {
filter = filter.and(additionFilter);
}
}
}
3)开始链。
在这种情况下,我可以说它是一个责任链吗?
答案 0 :(得分:0)
不,那不是责任链。我甚至认为这种模式似乎不符合您的任务。
维基百科声明:
[in]责任链,链中的一个类 处理请求
根据您的要求,这并不是真的有意义。这听起来像the decorator pattern的工作,这与责任链模式非常相似。
使用装饰器模式的解决方案可能如下所示:
interface FileSearch
{
List<File> search();
}
class AllFiles implements FileSearch
{
private final Path searchDirectory;
public AllFiles(Path searchDirectory)
{
this.searchDirectory = searchDirectory;
}
public List<File> search()
{
// return all files in directory
}
}
class LargerThan implements FileSearch
{
private final FileSearch delegate;
private final long size;
public LargerThan(FileSearch delegate, long size)
{
this.delegate = delegate;
this.size = size;
}
public List<File> search()
{
return delegate.search().stream()
.filter(file -> file.length() > size)
.collect(Collectors.toList());
}
}
class SmallerThan implements FileSearch
{
//Similar to above, but with 'less than' instead of 'greater than'
}
然后,您可以按照自己喜欢的顺序组合这些过滤器:
List<Files> searchResults = new LargerThan(
new SmallerThan(
new AllFiles(Paths.get("/some/dir/")),
2000L
),
1000L
).search();