设计模式-转换器模式

目的:

转换器模式的目的是提供相应类型之间双向转换的通用方法,允许进行干净的实现,而类型之间无需相互了解。

程序示例:

在真实的应用中经常有这种情况,数据库层包含需要被转换成业务逻辑层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)]
         */

类图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值