三、设计模式之适配器
适配器模式是使用某个实现类,实现另一种接口的行为,在工作中非常常用。常用到使用时都不知道是在用这个模式。
那么接口可以适配,实体可以适配么?当然,比接口适配更常用的是实体的适配。
场景
你作为渠道层为客户提供REST服务,提供核心服务能力的资源是你的下游。由于各种原因,下游及你客户各报文的字段是不一样的,数据库中的命名及内容与接口也不尽相同,但大多数字段都是一样的。为了不让测试和开发犯难,开启适配之旅吧。
单测
当客户输入DemoDto no字段,我的业务逻辑实体MyInputBo serialNo会被赋值。需要说明的是DemoDto是提供给客户的实体,MyInputBo是包括业务处理逻辑的实体,可以做字段长度的校验等。
public class GivenClientInputSerialNo {
DemoDto demoDto = new DemoDto();
@Before
public void setUp() throws Exception {
demoDto.setNo("serialNO");
demoDto.setApp_id("120123");
demoDto.setId3("id3");
}
@Test
public void should_adapt_to_my_bo() {
DemoDtoToConvert mapper = Mappers.getMapper(DemoDtoToConvert.class);
MyInputBo bo = mapper.from(demoDto);
assertEquals(bo.getAppid(), demoDto.getApp_id());
}
}
实现
使用mapstruct,各种类型转换非常方便
@Mapper(componentModel = "spring")
public interface DemoDtoToConvert {
@Mapping(source = "no", target = "serialNo")
@Mapping(source = "app_id", target = "appid")
MyInputBo from(DemoDto order);
}
后续bo、po转换也是一样。