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

时间:2017-08-26 08:16:03

标签: generics design-patterns template-method-pattern

我是设计模式的新手。

我的问题是我在下面的案例中使用什么模式?

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 个答案:

答案 0 :(得分:0)

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

  1. getUser方法的参数类型在一种情况下可以是String,在其他情况下可以是File
  2. 提取用户数据的机制因内容而异,即从网址或文件中提取
  3. 第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);
    }
    
相关问题