针对不同输入参数类型和数据提取算法的设计模式
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 分组,因为它们需要操作类似的行为。
如果仔细研究用户案例,应该清楚设计的两个主要方面需要灵活:
getUser
方法的参数类型在一种情况下可以是String
,在其他情况下可以是File
。
- 提取用户数据的机制会因来源而异,即从 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);
}
我是设计模式的新手。
我的问题是在下面的情况下我使用什么模式?
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 分组,因为它们需要操作类似的行为。
如果仔细研究用户案例,应该清楚设计的两个主要方面需要灵活:
getUser
方法的参数类型在一种情况下可以是String
,在其他情况下可以是File
。- 提取用户数据的机制会因来源而异,即从 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);
}