java - 采取什么方法使我的代码更通用 Java/Spring?
问题描述
在一个SpringBoot
应用程序中,我有一个服务(在 Spring 意义上),它调用客户端,这些客户端通过调用一个相同的函数来使用 RestFul Web 服务,createXXX
除了对象的性质在方法的输入处发生变化。为简化起见,假设我对动物的创建进行建模:将对象CatDTO
、DogDTO
、HorseDTO
作为 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,
}
}
在实现的 AnimalService 中,AnimalServiceImpl
我尝试创建三种动物这是代码
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 是动物的类,但我在使用一个参数自动装配构造函数时遇到问题。
提前感谢!
解决方案
除非你有Inheritance
,否则即使你尝试使用也无法有效地解决这个问题Generics
这是简化代码的一种方法:
BaseAnimalDto
现在是一个标记界面。如果需要,您可以在此处使用常用方法。
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);
}
....
}
}