设计模式之适配器模式

该代码示例展示了如何使用Java进行对象字段的适配转换,通过MQAdapter类的filter方法将Account对象的字段映射到BaseInfo对象中。同时,定义了OrderAdapterService接口,用于实现不同环境下的订单服务适配,例如InsideOrderAdapterServiceImpl和ThirdOrderAdapterServiceImpl,分别代表内部订单服务和第三方订单服务的适配。

字段适配

public class BaseInfo {
    private String userId;
    private String bizId;
    private String bizTime;
    private String desc;
    private String address;
    // get and set
    @SneakyThrows
    @Override
    public String toString() {
        return new ObjectMapper().writeValueAsString(this);
    }
 public static class Account implements Serializable {
        String num;
        String address;
        String date;
        String desc;
        String bizId;
         // get and set
    }
public class MQAdapter {


    public static BaseInfo filter(String json, Map<String, String> link) throws JsonProcessingException {
        return baseInfo(new ObjectMapper().readValue(json, Map.class), link);
    }

    public static BaseInfo baseInfo(Map obj, Map<String, String> link) {

        BaseInfo baseInfo = new BaseInfo();

        link.forEach((key, val) -> {
            Object v = obj.get(link.get(key));
            try {

                String substring = key.substring(0, 1).toUpperCase() + key.substring(1);
                System.out.println(substring);
                BaseInfo.class.getMethod("set" + key.substring(0, 1).toUpperCase() + key.substring(1), String.class)
                        .invoke(baseInfo, v);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            }
        });
        return baseInfo;
    }


}

// 测试
 Account account = new Account();
 account.num = "1000";
  account.address = "中国北京";
  account.date = "2021-09-08 19:00:00";
  account.desc = "描述";
  account.bizId = "12112";


  Map<String, String> links = new HashMap<>();
  links.put("userId", "num");
  links.put("address", "address");
  links.put("bizId", "bizId");
  links.put("bizTime", "date");
  links.put("desc", "desc");

  BaseInfo baseInfo = MQAdapter.filter(account.toString(), links);
  System.out.println("适配前:" + account.toString());
  System.out.println("适配后:" + baseInfo.toString());
 // 结果输出
 适配前:{"num":"1000","address":"中国北京","date":"2021-09-08 19:00:00","desc":"描述","bizId":"12112"}
 适配后:{"userId":"1000","bizId":"12112","bizTime":"2021-09-08 19:00:00","desc":"描述","address":"中国北京"}

公共逻辑适配

public interface OrderAdapterService {

    /**
     * <p>是否是首单
     * @param userId 用户ID
     * @param userId 商品ID
     * @return {@link boolean}
     */
    boolean isFirst(Long userId, Long productId);
}
public class InsideOrderAdapterServiceImpl implements OrderAdapterService {

    private OrderService orderService;
    /**
     * <p>内部订单
     * @param userId
     * @param productId 
     * @return {@link boolean}
     */
    @Override
    public boolean isFirst(Long userId, Long productId) {
        return orderService.queryUserOrderCount(userId, 1L) <= 1;
    }
}

public class OrderService {
    
    /**
     * <p>内部订单
     * @param userId
     * @param productId 
     * @return {@link int}
     */
    public int queryUserOrderCount(Long userId,Long productId){
        return 1;
    }
}
public class ThirdOrderAdapterServiceImpl implements OrderAdapterService {

    ThirdOrderService thirdOrderService = new ThirdOrderService();
    /**
     * <p>三方订单
     * @param userId
     * @param productId 
     * @return {@link boolean}
     */
    @Override
    public boolean isFirst(Long userId, Long productId) {
        return thirdOrderService.queryUserOrderCount(userId, productId) <= 1;
    }
}

public class ThirdOrderService {

    /**
     * <p>三方订单
     *
     * @param userId
     * @param productId
     * @return {@link int}
     */
    public int queryUserOrderCount(Long userId, Long productId) {
        return 1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值