一. 背景和使用
- 今天在看项目代码的时候,发现一个范型类的使用方式,稍稍研究了一下,写了一个Demo。这种范型类的使用场景:多种产品(Adto,Bdto)具有相似的工作流(AbstractWorkflow),但这些工作流(AWorkflow,BWorkflow)的处理方式有些区别,如设置产品,保存产品等,它们处理都是以产品为中心的,因此有这类需求的可以使用类似用法。
二. 实例
1. 产品实体DTO
public class PersonDTO {
private String name;
private Integer age;
public PersonDTO(String name, Integer age) {
this.name = name;
this.age = age;
}
}
public class CustomDTO<T> {
private PersonDTO personDTO;
private List<T> t;
public CustomDTO(PersonDTO personDTO) {
this.personDTO = personDTO;
}
}
public class Adto {
private String name;
private String nameAndAge;
public Adto(String name, String nameAndAge) {
this.name = name;
this.nameAndAge = nameAndAge;
}
}
public class Bdto {
private String name;
public Bdto(String name) {
this.name = name;
}
}
2. 工作流
public abstract class AbstractWorkflow<T> implements ICustomSavePipline<T>{
@Autowired
private ICustomSavePipline iCustomSavePipline;
public void printTest(PersonDTO personDTO){
CustomDTO<T> customDTO = new CustomDTO<>(personDTO);
this.handle(customDTO,personDTO.getName(),(custom,name)->iCustomSavePipline.assembleDTO(custom,name));
iCustomSavePipline.saveTest(customDTO);
}
private void handle(CustomDTO<T> customDTO, String name, BiFunction<CustomDTO,String, List> biFunction){
List<T> list = biFunction.apply(customDTO,name);
customDTO.setT(list);
}
}
@Component
public class AWorkflow extends AbstractWorkflow<Adto> {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public int saveTest(CustomDTO<Adto> customDTO) {
logger.info("AWorkflow:{}",JSON.toJSON(customDTO));
return 0;
}
@Override
public List<Adto> assembleDTO(CustomDTO<Adto> customDTO, String name) {
List<Adto> adtos = Lists.newArrayList();
adtos.add(new Adto(name,customDTO.getPersonDTO().getAge()+name));
return adtos;
}
}
@Component
public class BWorkflow extends AbstractWorkflow<Bdto> {
private Logger logger = LoggerFactory.getLogger(getClass());
@Override
public int saveTest(CustomDTO<Bdto> customDTO) {
logger.info("BWorkflow:{}",JSON.toJSON(customDTO));
return 0;
}
@Override
public List<Bdto> assembleDTO(CustomDTO<Bdto> customDTO, String name) {
List<Bdto> bdtos = Lists.newArrayList();
bdtos.add(new Bdto(name));
return bdtos;
}
}
3. 抽象操作
public interface ICustomSavePipline<T> {
int saveTest(CustomDTO<T> customDTO);
List<T> assembleDTO(CustomDTO<T> customDTO, String name);
}
4. Manager.java
@Component
public class TestManager {
@Autowired
private AWorkflow aWorkflow;
@Autowired
private BWorkflow bWorkflow;
public void test(){
PersonDTO aPersonDTO = new PersonDTO("Aname",12);
aWorkflow.printTest(aPersonDTO);
PersonDTO bPersonDTO = new PersonDTO("bname",16);
bWorkflow.printTest(bPersonDTO);
}
}
5. 运行结果
AWorkflow:{"personDTO":{"name":"bname","age":16},"t":[{"name":"bname","nameAndAge":"16bname"}]}
BWorkflow:{"personDTO":{"name":"Aname","age":12},"t":[{"name":"Aname"}]}