我是设计模式的新手。
我的问题是我在下面的案例中使用什么模式?
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分组,因为它需要操作类似的行为。
答案 0 :(得分:0)
如果仔细研究用户案例,应该清楚设计的两个主要方面需要灵活:
getUser
方法的参数类型在一种情况下可以是String
,在其他情况下可以是File
。 第1点可以通过使用泛型/模板函数来解决,其中UserExtractorService
可以具有类型参数,或getUser
方法可以具有类型参数。类或函数的类型参数将表示getUser
函数的输入参数类型,并将在实例化UserExtractorService
实现时由客户端定义。
第2点可以使用Template method design pattern来解决。请注意,这与C ++模板类和方法不同。模板方法模式是一种行为设计模式,它定义了操作中算法的程序框架,将一些步骤推迟到子类。
将此转换为代码,getUser
方法将是模板方法。接下来,我们将定义一个名为String extractUserData(T source)
的抽象方法,该方法将在getUser
中调用。此抽象方法将由子类实现,并包含用于从特定源提取数据的算法。我们基本上每个用户数据源(Web,文件)等都有一个子类。 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);
}