java - 采取什么方法使我的代码更通用 Java/Spring?

标签 java spring generics design-patterns autowired

SpringBoot 应用程序中,我有一个服务(在 Spring 意义上),它通过调用与 createXXX 相同的函数来调用本身使用 RestFul Web 服务的客户端,除了对象的性质在方法的输入处发生变化。 为了简化起见,我们假设我对动物的创建进行建模:使用对象 CatDTODogDTOHorseDTO 作为 Web 服务的输入。 AnimaslDTO是由不同类型的动物组成的对象(没有继承关系)。

我以相同的方式创建三个客户端让我们以猫为例

package com.animals.client;
import ...

@Service
public class CatClient {

    private static final String CODE_WS_CREATE_CAT = "createCat";
    /**
     * Call RestFul WS for Cat Creation
     * @param catDTO
     */
    public ResponseEntity<String> createCat(CatDTO catDTO)
    {
        // ... Call a RestFul WS in the same manner for each animal. Only the parameter change in each client
        // --> ie dogDTO in DogClient.createDog, HorseDTO in HorseClient.createHorse,
    }
}

在由 AnimalServiceImpl 实现的 AnimalService 中,我尝试创建三个动物 这是代码

package com.animals.service.impl;

import ...

@Service
public class AnimalServiceImpl implements AnimalService {

    @Autowired
    private CatClient catClient;

    @Autowired
    private DogClient dogClient;

    @Autowired
    private HorseClient horseClient;

    @Override
    public ResponseEntity<String> createAnimals(AnimalsDTO animalsDTO) {
        catClient.createCat(animalsDTO.getCat());
        dogClient.createDog(animalsDTO.getDog());
        horseClient.createHorse(animalsDTO.getHorse());
        .... 
    }
}

我想知道如何在 Spring 或 Java 中为与 createXXX 非常相似的方法生成我的客户端。我可以使用什么设计模式?我尝试过使用Java泛型,但它不太适合Spring。我尝试创建一个 AnimalClient(T) 类,其中 T 是动物,但在使用一个参数 Autowiring 构造函数时遇到问题。

提前致谢!

最佳答案

除非你有继承,否则即使你尝试使用泛型也无法有效地解决这个问题

这是简化代码的一种方法:

BaseAnimalDto 目前是一个标记接口(interface)。如果您愿意,您可以在这里使用常用方法。

public interface BaseAnimalDTO {

}

CatDTO

public class CatDTO implements BaseAnimalDTO {
    // Cat DTO code
}

创建一个BaseAnimalClient如下

public interface BaseAnimalClient {

    ResponseEntity<String> create(BaseAnimalDTO dto);
}

CatClient 看起来像这样

@Service
public class CatClient implements BaseAnimalClient {

    private static final String CODE_WS_CREATE_CAT = "createCat";

    @Override
    public ResponseEntity<String> create(BaseAnimalDTO dto) {
        return null;
    }
}

让我们创建一个通用的AnimalClient,如下所示:

@Service
public class AnimalClient implements BaseAnimalClient {

    @Autowired
    private CatClient catClient;

    @Autowired
    private DogClient dogClient;

    @Autowired
    private HorseClient horseClient;

    @Override
    public ResponseEntity<String> create(BaseAnimalDTO dto) {
        BaseAnimalClient client;
        if (dto instanceof CatDTO) {
            client = catClient;
        } else if (dto instanceof DogDTO) {
            client = dogClient;
        } else {
            client = horseClient;
        }
        return client.create(dto);
    }
}

现在,您的 AnimalServiceImpl 看起来像这样

@Service
public class AnimalServiceImpl implements AnimalService {

    @Autowired
    private AnimalClient animalClient;

    @Override
    public ResponseEntity<String> createAnimals(AnimalsDTO animalsDTO) {
        animalClient.create(animalsDTO.getCat());
        animalClient.create(animalsDTO.getDog());
        animalClient.create(animalsDTO.getHorse());
        .... 
    }
}

但是,如果您可以像这样修改 AnimalsDTO:

public class AnimalsDTO {

    private List<? extends BaseAnimalDTO> animalDtos;

    // getter, setters

}

然后,您的 AnimalServiceImpl 将更加简化,如下所示:

@Service
public class AnimalServiceImpl implements AnimalService {

    @Autowired
    private AnimalClient animalClient;

    @Override
    public ResponseEntity<String> createAnimals(AnimalsDTO animalsDTO) {
        for (BaseAnimalDTO animalDTO : animalsDTO.getAnimalDtos()) {
            animalClient.create(animalDTO);
        }
        ....
    }
}

关于java - 采取什么方法使我的代码更通用 Java/Spring?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59503724/

相关文章:

java - Java 和 Swing 中的跨平台按钮排序

java - 如何使用java将一个XML文件拆分为多个XML文件

spring - 我们可以为 filterChainProxy 中的单个过滤器链提供多种模式吗

java - 你能用 Graphics g 绘制 Area 对象吗?

java - AngularJS + Spring 项目架构

java - 如何使用 spring-integration 重试套接字服务器创建?

c# - 强制用户在 C# 中使用正确的泛型方法

java - 如何将类型安全对象强制转换为 JComboBox<String>?

java - 在 Java 中实例化一个泛型类

java - Android Studio 3.0 滞后的打字体验