java - Java 类设计 - 最佳方法的建议。类扩展抽象类并实现接口
问题描述
不知道设计课采用什么方法。
public interface AuthoringEvent {
ProcessingResultEvent authoringEvent(Event data);
}
AbstractAuthoringEvent 抽象类实现接口
public abstract class AbstractAuthoringEvent implements AuthoringEvent {
@Override
public ProcessingResultEvent authoringEvent(Event data) {
ResponseEntity<Event> resultData = callService(data);
etc...
}
protected abstract ResponseEntity<Event> callService(Event requestData);
}
AuthoringEventIT 类扩展抽象类
public class AuthoringEventIT extends AbstractAuthoringEvent {
@Autowired
private RESTClient restClient;
protected ResponseEntity<Event> callService(Event requestData) {
return restClient.callWebServiceWithAction(url, httpPostMethod, requestData, Event.class);
}
资源端点类
@Autowired
private AuthoringEventIT authoringEventIT;
@PostMapping()
public ResponseEntity<Event> authorEvent(@RequestBody final EventRequest request) {
ProcessingResultEvent responseData = authoringEventIT.authoringEvent(request);
return responseData.getProcessedData();
}
l 还有 2 个相同的实现,例如 Event for Venue 和 Organization 模型类。我知道我可以删除接口并在抽象类级别上做所有事情,这将所有具体类实现它们自己的目的,就像在 AuthoringEventIT.class 上一样,但我的问题是......
这些抽象类真的需要单独的接口来实现吗?也许所有 3 个抽象类都可以实现一个 Authoring 接口某种通用方法,但是如何避免在像 AuthoringEventIT 这样扩展抽象类的具体类中实现,并且需要再次实现已经在抽象类中实现的接口方法?非常感谢...
解决方案
在 Spring 框架中,一个接口有多个实现是没有问题的。如果接口和最终实现之间是一个抽象类,这将不是问题。
在这种情况下,有两种解决冲突的方法:
- 使用@Qualifier 并加载所有实现以在运行时选择一个
- 使用@Condition 之一并加载一个依赖于某些条件的实现
在第一种情况下,它将是这样的
@Component("authoringEventIT")
public class AuthoringEventIT extends AbstractAuthoringEvent { //code }
@Autowired
@Qualifier("authoringEventIT")
private AuthoringEvent authoringEventIT;
推荐阅读
- google-cloud-platform - 仅将某些文件移动到 GCP 并保留子文件夹
- blazor - 在 Blazor 客户端和 Blazor 服务器之间存储和检索数据
- html - 当我将它放在 Html 脚本标签中并通过浏览器打开 html 时,React 包不起作用
- linux - bash检查文件中的所有行是否等于“数字”
- java - 如何在 BOX Api 中上传文件:空指针异常
- c++ - Vowpal Wabbit 是否支持在训练期间添加和删除功能?
- spring - Bean 名称错误的 BindingResult 和普通目标对象都不是
- swift - 如何衡量异步方法的性能?
- html - CSS 样式表适用于某些属性,但不是全部
- javascript - 在 Accordion 菜单中隐藏部分