首页 > 解决方案 > 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 这样扩展抽象类的具体类中实现,并且需要再次实现已经在抽象类中实现的接口方法?非常感谢...

标签: javaspring-mvcspring-bootinterfaceabstract-class

解决方案


在 Spring 框架中,一个接口有多个实现是没有问题的。如果接口和最终实现之间是一个抽象类,这将不是问题。

在这种情况下,有两种解决冲突的方法:

  • 使用@Qualifier 并加载所有实现以在运行时选择一个
  • 使用@Condition 之一并加载一个依赖于某些条件的实现

在第一种情况下,它将是这样的

@Component("authoringEventIT")
public class AuthoringEventIT extends AbstractAuthoringEvent { //code }

@Autowired
@Qualifier("authoringEventIT")
private AuthoringEvent authoringEventIT;

推荐阅读