gpt4 book ai didi

Java过滤器工厂实现

转载 作者:行者123 更新时间:2023-11-30 05:41:19 27 4
gpt4 key购买 nike

受 FilenameFilter.java 的启发,我想使用类似的方法/设计模式来解决我的问题。我从 sftp 服务器中选择文件基于:

  1. 如果超过 n 天
  2. 如果它的存在时间超过 n 天并且其名称具有某种模式。

我定义了一个功能接口(interface)SemanticFileFilter如下:

public interface SftpFileFilter
{
boolean accept(LsEntry sftpFile);
}

sftp 的 LsEntry 基本上类似于 java 中的 File。

想要定义 SftpFileFilterFactory 以在一个地方获取 SftpFileFilter 的所有实现,如下所示:

    public class SftpFileFilterFactory 
{
public static final SftpFileFilter OLD_FILE_FILTER = new SftpFileFilter()
{
//ERROR: because Interface function method should take only 1 parameter
//@Override
public boolean accept(LsEntry lsEntry,int nDays)
{
//checks if files if older than nDays
}
};

public static final SftpFileFilter PATTERN_MATCH_OLD_FILE_FILTER = new SftpFileFilter()
{
//ERROR: because Interface function method should take only 1 parameter
//@Override
public boolean accept(LsEntry lsEntry,int nDays, String pattern)
{
//checks if files if older than nDays and matches pattern "pattern"
}
};
}

如何设计接口(interface)的函数方法或工厂实现,以便将来如果需要定义更多类似的过滤器,我不需要在代码更改上费心,只需定义新的过滤器即可。

我们还应该能够链接过滤器。也就是说,为旧文件定义一个过滤器,为模式匹配定义另一个过滤器。如果两者都需要使用,它们应该能够链接在一起,因此两者都可以使用。

最佳答案

您的问题提醒Command设计模式。您需要实现不同的条件并提供其他参数,您可以使用构造函数并创建类或使用 Java 8 lambda 表达式。请参阅下面的示例:

import java.util.ArrayList;
import java.util.List;

public class DesignPatterns {

public static void main(String[] args) {
List<SftpFileFilter> filters = new ArrayList<>();
filters.add(new OlderThanNDaysFilter(10));
filters.add(new NameSftpFileFilter("tmp.txt"));
// you can use lambda as well
filters.add((file) -> file.getName().length() > 0);
}
}

interface SftpFileFilter {
boolean accept(LsEntry sftpFile);
}

class OlderThanNDaysFilter implements SftpFileFilter {

private final int days;

public OlderThanNDaysFilter(int days) {
this.days = days;
}

@Override
public boolean accept(LsEntry sftpFile) {
return sftpFile.isOlder(days);
}
}

class NameSftpFileFilter implements SftpFileFilter {

private final String name;

public NameSftpFileFilter(String name) {
this.name = name;
}

@Override
public boolean accept(LsEntry sftpFile) {
return sftpFile.getName().equals(name);
}
}

这些对象太小,不需要为其创建工厂。如果需要,您可以创建并使用它们。当然,你可以创建factory它创建了一些预定义的过滤器:

class ConditionFactory {
private static final SftpFileFilter OLDER_THAN_TEN = new OlderThanNDaysFilter(10);
private static final SftpFileFilter PASSWORDS_FILE = new NameSftpFileFilter("passwords.txt");

public SftpFileFilter createOlderThan10Days() {
return OLDER_THAN_TEN;
}

public SftpFileFilter createPasswordsFile() {
return PASSWORDS_FILE;
}

public SftpFileFilter createNameFilter(final String name) {
return new NameSftpFileFilter(Objects.requireNonNull(name));
}

public SftpFileFilter createOlderThan(final int days) {
return new OlderThanNDaysFilter(days);
}
}

过滤器实现和客户端代码之间有很好的分离,客户端代码不知道如何实现按名称过滤,并且可以轻松交换。

Java 8 中,您可以直接使用 java.util.function.Predicate 或通过接口(interface)扩展它:

interface SftpFileFilter extends Predicate<LsEntry> {
boolean accept(LsEntry sftpFile);

@Override
default boolean test(LsEntry lsEntry) {
return accept(lsEntry);
}
}

关于Java过滤器工厂实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55586442/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com