【发布时间】:2019-05-11 12:26:55
【问题描述】:
假设我有一些通用接口
public interface Service<T> {
T getData();
}
public interface ResponseBuilder<T> {
void build(T response);
}
以及一些使用这些接口的通用类
public class Orchestrator<T> {
private Service<T> service;
private List<ResponseBuilder<T>> responseBuilders;
public Orchestrator(Service<T> serviceImpl, List<ResponseBuilder<T>> buildersImpl){
this.service = serviceImpl;
this.responseBuilders = buildersImpl;
}
public void execute() {
T response = service.getData();
responseBuilders
.stream()
.map(builder -> builder.build(response))
.forEach(data -> storageUtil.upload(data));
}
}
当客户端开发人员要使用这些 API 时,我如何强制他/她在这些通用接口的具体实现中传递相同的类型,以避免类型不匹配异常。
创建的 Orchestrator 实例未指定其类型,可以将不同类型作为参数 例如:-
public class App{
public static void main(String[] args){
ResponseBuilder<String> response1 = new SomeImpl(); // type STRING
Service<Integer> service = new SomeServiceImpl(); // type INTEGER
// completely valid and compilable code, will throw ex at runtime
Orchestrator orch = new Orchestrator(service, Arrays.asList(response1));
}
}
还有什么更好的设计?
【问题讨论】:
-
为什么
Orchestrator使用原始类型? -
因为我想为不同的类型执行同样的事情
-
然后创建不同的实例?
-
@MuratKaragöz 如果没有原始编排器,您将无法定义服务的原始实例变量
-
使用抽象工厂模式修复了设计
标签: java oop design-patterns interface abstract-class