使用Java 8创建责任链

时间:2018-04-10 17:16:52

标签: java design-patterns java-8

我有一个测试任务。我必须创建责任链来搜索文件系统中的文件。例如,一个单元必须检查文件的名称和其他一个检查文件的大小范围。

如果我像这样使用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)开始链。

在这种情况下,我可以说它是一个责任链吗?

1 个答案:

答案 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();