1

我是设计模式的新手。

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

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 分组,因为它需要操作类似的行为。

4

1 回答 1

0

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

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

第 1 点UserExtractorService可以通过使用可以有类型参数或getUser方法可以有类型参数的泛型/模板函数来解决。类或函数的类型参数将表示函数的输入参数类型,getUser并由客户端在实例化UserExtractorService实现时定义。

第 2 点可以通过使用模板方法设计模式来解决。请注意,这与 C++ 模板类和方法不同。模板方法模式是一种行为设计模式,它在操作中定义算法的程序骨架,将一些步骤推迟到子类。

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

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);
}
于 2017-08-27T06:57:08.260 回答