您当前的位置: 首页 > 

java持续实践

暂无认证

  • 2浏览

    0关注

    746博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

设计模式 适配器模式

java持续实践 发布时间:2022-03-20 13:03:10 ,浏览量:2

文章目录
      • 适配器模式介绍
      • 适配器模式实战
        • 不使用适配器模式的写法
        • 使用适配器模式的写法
          • mq消息适配
          • 接口适配

适配器模式介绍

把原本不兼容的接口, 进行改造, 让其进行统一适配, 方便各种形式的使用. 开发中, 类似中台业务, 订单有很多的来源, 把接收订单的接口进行封装, 适配各种订单进入中台.

适配器模式实战

模拟MQ消息. 有开户消息 , 自营订单消息, 第三方店铺订单消息, 都要通过mq进行处理. 粗暴的写法是每一个消息都写一个类处理. 而使用适配器模式后, 可以把消息进行统一字段封装, 放在一个类进行处理.

创建 tutorials-9.0-0 模块. 创建各种mq消息实体类 . 开户实体类

public class Create_account {

    private String number; // 账户编号
    private String address; // 开户地
    private Date accountDate; // 开户时间
    private String desc;  //  开户描述

	// get set toString 
}

自营订单实体类

public class OrderMq {

    private String uid; //  用户id
    private String sku; // 商品sku
    private String orderId; // 订单id
    private Date createOrderTime; // 下单时间
}

第三方卖家订单实体类

public class POPOrderDelivered {

    private String uId;     // 用户ID
    private String orderId; // 订单号
    private Date orderTime; // 下单时间
    private Date sku;       // 商品
    private Date skuName;   // 商品名称
    private BigDecimal decimal; // 金额
 }

查询自营订单下单数量

public class OrderService {
    private Logger logger = LoggerFactory.getLogger(OrderService.class);

    public long queryUserOrderCount(String userId) {
        logger.info("自营商家, 查询用户的订单是否为首单:  {}", userId);
        return 10L; //  此处模拟数据库查询出来的为10单
     }
}

查询第三方卖家订单数量

public class POPOrderService {
    private Logger logger = LoggerFactory.getLogger(POPOrderService.class);

    public boolean isFirstOrder(String uId) {
        logger.info("POP商家 查询用户的订单是否为首单 : {}", uId);
        return true;
    }
}
不使用适配器模式的写法

创建tutorials-9.0-1 模块. pom中引入tutorials-9.0-0模块 创建处理账户的类

public class Create_AccountMqService {
    public void onMessage(String message) {
        Create_account mq = JSON.parseObject(message, Create_account.class);
        mq.getNumber();
        mq.getAccountDate();
        // 处理业务
    }
}

处理自营订单的类

public class OrderMqService {
    public void onMessage(String message) {
        OrderMq mq = JSON.parseObject(message, OrderMq.class);
        mq.getUid();
        //处理自营订单的业务
    }
}

第三方店铺订单的类

public class POPOrderDeliverdService {
    public void onMessage(String message) {
        // 处理pop 店的订单消息
        POPOrderDelivered mq = JSON.parseObject(message, POPOrderDelivered.class);
        mq.getuId();
        mq.getOrderId();
    }
}

这种写法就是一个消息类型,来建立一个类进行处理.

使用适配器模式的写法 mq消息适配

使用适配器模式来处理mq消息. 创建RebateInfo类, 来进行消息的统一处理封装.

public class RebateInfo {

    private String userId; // 用户id
    private String bizId; // 业务id
    private Date bizTime; // 业务时间
    private String desc ; // 业务描述

	// get set toString
		
	    public void setBizTime(String bizTime) {
        this.bizTime = new Date(Long.parseLong("1591077840669"));
    }
}

创建MQAdapter 消息适配器类, 把消息转化为map , 并通过反射赋值给RebateInfo

public class MQAdapter {

    public static RebateInfo filter(String strJson, Map link) throws Exception {
        return filter(JSON.parseObject(strJson, Map.class), link);
    }

    public static RebateInfo filter(Map obj, Map link) throws Exception {
        RebateInfo rebateInfo = new RebateInfo();
        for (String key : link.keySet()) {
            Object val = obj.get(link.get(key));
            //  用反射, 并且把RebateInfo对象的set方法根据link 取值.
            RebateInfo.class.getMethod("set" + key.substring(0, 1).toUpperCase() + key.substring(1), String.class)
                    .invoke(rebateInfo, val.toString());
        }
        return rebateInfo;
    }
}

进行测试

   @Test
    public void test_MQAdapter() throws Exception {
        Create_account create_account = new Create_account();
        create_account.setNumber("100001");
        create_account.setAddress("中国 北京 朝阳区");
        create_account.setAccountDate(new Date());
        create_account.setDesc("开户");

        HashMap link01 = new HashMap();
        link01.put("userId", "number");
        link01.put("bizId", "number");
        link01.put("bizTime", "accountDate");
        link01.put("desc", "desc");

        RebateInfo rebateInfo01 = MQAdapter.filter(create_account.toString(), link01);
        System.out.println("mq.create_account(适配前)" + create_account.toString());
        System.out.println("mq.create_account(适配后)" + JSON.toJSONString(rebateInfo01));

        System.out.println("");

        OrderMq orderMq = new OrderMq();
        orderMq.setUid("1000001");
        orderMq.setSku("10043242");
        orderMq.setOrderId("100000234344444");
        orderMq.setCreateOrderTime(new Date());

        HashMap link02 = new HashMap();
        link02.put("userId", "uid");
        link02.put("bizId", "orderId");
        link02.put("bizTime", "createOrderTime");
        RebateInfo rebateInfo02 = MQAdapter.filter(orderMq.toString(), link02);

        System.out.println("mq.orderMq(适配前)" + orderMq.toString());
        System.out.println("mq.orderMq(适配后)" + JSON.toJSONString(rebateInfo02));
    }

控制台打印如下. 可以看到不同的消息 ,都进行了统一的适配封装.

mq.create_account(适配前){"accountDate":1647747993709,"address":"中国 北京 朝阳区","desc":"开户","number":"100001"}
mq.create_account(适配后){"bizId":"100001","bizTime":1591077840669,"desc":"开户","userId":"100001"}

mq.orderMq(适配前){"createOrderTime":1647747993819,"orderId":"100000234344444","sku":"10043242","uid":"1000001"}
mq.orderMq(适配后){"bizId":"100000234344444","bizTime":1591077840669,"userId":"1000001"}
接口适配

创建OrderAdapterService接口

public interface OrderAdapterService {
    boolean isFirst(String uId);
}

自营订单的实现

public class InsideOrderService implements OrderAdapterService {

    private OrderService orderService = new OrderService();

    public boolean isFirst(String uId) {
        return orderService.queryUserOrderCount(uId)             
关注
打赏
1658054974
查看更多评论
0.0418s