针对不同输入参数类型和数据提取算法的设计模式

Design pattern for different input parameter type and data extraction algorithm

我是设计模式的新手。

我的问题是在下面的情况下我使用什么模式?

interface UserExtractorService {
    String getUser(XXXX);
    default validate(File file);
}

class AExtractorService {
    public String getUser(String url) {
           validate(downloadfromWeb(url));
       return getFromWeb(url);
    }
}

class BExtractorService {
    public String getUser(File) {
           validate(file);
           parsingFromFile(File);
       return parsingFromFile(File);
    }
}

class Client {

    public void GetUsers(String key) {
         userExtractorService.getUser(key);
    }

    public void GetUsers(File file) {
         userExtractorService.getUser(file);
    }
}

我想将 AExtractor 和 BExtractor 分组,因为它们需要操作类似的行为。

如果仔细研究用户案例,应该清楚设计的两个主要方面需要灵活:

  1. getUser方法的参数类型在一种情况下可以是String,在其他情况下可以是File
  2. 提取用户数据的机制会因来源而异,即从 Web url 或文件中提取

点 1 可以通过使用 generics/template 函数来解决,其中 UserExtractorService 可以有一个类型参数,或者 getUser 方法可以有一个类型参数。 class 或函数的类型参数将表示 getUser 函数的输入参数类型,并由客户端在实例化 UserExtractorService 实现时定义。

点 2 可以使用 Template method design pattern 解决。请注意,这不同于 C++ 模板 classes 和方法。模板方法模式是一种行为设计模式,它在操作中定义算法的程序骨架,将一些步骤推迟到 subclasses.

将其转换为代码,getUser 方法就是模板方法。接下来,将定义一个名为 String extractUserData(T source) 的抽象方法,它将在 getUser 中调用。这个抽象方法将由 subclasses 实现,并将包含从特定源提取数据的算法。我们基本上每个用户数据源(Web、文件)等都有一个 subclass。 Java 中的 getUser 方法的示例将如下:

abstract class UserExtractorService<T> {
   public final String getUser(T source) {
         validate(source);
         return extractUserData(source);
   }

   protected abstract String extractUserData(T source);
   protected abstract void validate(File f);
}