目的:
转换器模式的目的是提供相应类型之间双向转换的通用方法,允许进行干净的实现,而类型之间无需相互了解。
程序示例:
在真实的应用中经常有这种情况,数据库层包含需要被转换成业务逻辑层DTO来使用的实体。对于潜在的大量类进行类似的映射,我们需要一种通用的方法来实现这一点。
1.创建通用的转换器。
public class Converter<T, R>{
private final Function<T,R> fromDto;
private final Function<R,T> fromEntity;
public Converter(final Function<T,R> fromDto, final Function<R,T> fromEntity) {
this.fromDto = fromDto;
this.fromEntity = fromEntity;
}
public final R convertFromDto(final T dto) {
return fromDto.apply(dto);
}
public final T convertFromEntity(final R entity) {
return fromEntity.apply(entity);
}
public final List<R> creatFromDtos(final Collection<T> dtos){
return dtos.stream().map(this::convertFromDto).collect(Collectors.toList());
}
public final List<T> creatFromEntities(final Collection<R> entities){
return entities.stream().map(this::convertFromEntity).collect(Collectors.toList());
}
}
2.创建测试类和继承转换器
@ToString
@EqualsAndHashCode
@Getter
@RequiredArgsConstructor
public class User{
private final String firstName;
private final String lastName;
private final boolean active;
private final String userId;
}
@RequiredArgsConstructor
@Getter
@EqualsAndHashCode
@ToString
public class UserDto{
private final String firstName;
private final String lastName;
private final boolean active;
private final String email;
}
//转换器
@ToString
public class UserConverter extends Converter<User,UserDto>{
public UserConverter() {
super(UserConverter::convertToDto, UserConverter::convertToEntity);
}
//映射字段
private static UserDto convertToDto(User user) {
return new UserDto(user.getFirstName(), user.getFirstName(), user.isActive(), user.getUserId());
}
//映射字段
private static User convertToEntity(UserDto dto) {
return new User(dto.getFirstName(), dto.getLastName()
, dto.isActive(), dto.getEmail());
}
}
测试
UserConverter converter = new UserConverter();
UserDto dto = new UserDto("John", "Doe", true, "whatever[at]wherever.com");
User user = converter.convertFromEntity(dto);
List<User> users = Arrays.asList(new User("Camile", "Tough", false, "124sad"),
new User("Marti", "Luther", true, "42309fd"),
new User("Kate", "Smith", true, "if0243"));
System.out.println(users);
List<UserDto> userDtos = converter.creatFromDtos(users);
System.out.println(userDtos);
/*
[User(firstName=Camile, lastName=Tough, active=false, userId=124sad), User(firstName=Marti, lastName=Luther, active=true, userId=42309fd), User(firstName=Kate, lastName=Smith, active=true, userId=if0243)]
[UserDto(firstName=Camile, lastName=Camile, active=false, email=124sad), UserDto(firstName=Marti, lastName=Marti, active=true, email=42309fd), UserDto(firstName=Kate, lastName=Kate, active=true, email=if0243)]
*/
类图: