设计模式--适配器模式

引例

在这里插入图片描述

简介

基本介绍

适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。

工作原理

  1. 适配器模式:将一个类的接口转换成另一种接口.让 原本接口不兼容的类可以兼容。
  2. 从用户的角度看不到被适配者,是解耦的。
  3. 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法。
  4. 用户收到反馈结果,感觉只是和目标接口交互。
    在这里插入图片描述

示例

在实际业务开发中,经常需要做不同接口的兼容,尤其是中台服务。中台服务需要把各个业务线的类型服务同一包装,在对外提供接口。

在营销系统中,会遇到各种各样的MQ消息或接口,例:开户,内部订单、外部订单,如果逐个开发,会耗费很高的成本。此时,就需要有这样一个系统:能把外部MQ接入。
在这里插入图片描述

代码

public class CreateAccountMQ {
    private String number;
    private String address;
    private Date accountDate;
    private String description;
    public CreateAccountMQ() {
    }

    public CreateAccountMQ(String number, String address, Date accountDate, String decription) throws ParseException {

        this.number = number;
        this.address = address;
        this.accountDate = accountDate;
        this.description = decription;
    }

    public String getNumber() {
        return number;
    }

    public String getAddress() {
        return address;
    }

    public Date getAccountDate() {
        return accountDate;
    }

    public String getDecription() {
        return description;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public void setAccountDate(Date accountDate) {
        this.accountDate = accountDate;
    }

    public void setDecription(String decription) {
        this.description = decription;
    }

    @Override
    public String toString() {
        return "{\"number\":\""+number+"\",\"address\":\""+address+"\",\"accountDate\","+accountDate+",\"description\",\""+description+"\"}";

    }
}

public class OrderMQ {
    private String uId;
    private String goodId;
    private String orderId;
    private Date createOrderDate;
    private String desc;
    public OrderMQ() {
    }

    public OrderMQ(String uId, String goodId, String orderId, Date createOrderDate,String desc) throws ParseException {
        this.uId = uId;
        this.goodId = goodId;
        this.orderId = orderId;
        this.createOrderDate = createOrderDate;
        this.desc=desc;
    }

    public String getUId() {
        return uId;
    }

    public String getGoodId() {
        return goodId;
    }

    public String getOrderId() {
        return orderId;
    }

    public Date getCreateOrderDate() {
        return createOrderDate;
    }

    public void setuId(String uId) {
        this.uId = uId;
    }

    public void setGoodId(String goodId) {
        this.goodId = goodId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }

    public void setCreateOrderDate(Date createOrderDate) {
        this.createOrderDate = createOrderDate;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "{\"uId\":\""+uId+"\",\"goodId\":\""+goodId+"\",\"orderId\":\""+orderId+"\",\"createOrderDate\":"+createOrderDate+"}";

    }
}

目标类


```c
public class RebateInfo {
    private String userId;
    private String bizId;
    private String  bizDate;
    private String desc;



    public String getBizId() {
        return bizId;
    }

    public String getBizDate() {
        return bizDate;
    }

    public String getDesc() {
        return desc;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public void setBizId(String bizId) {
        this.bizId = bizId;
    }

    public void setBizDate(String bizDate) {
        this.bizDate = bizDate;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "RebateInfo{" +
                "userId='" + userId + '\'' +
                ", bizId='" + bizId + '\'' +
                ", bizDate=" + bizDate +
                ", desc='" + desc + '\'' +
                '}';
    }
}

适配类

public class MQAdapter {
    /*
    Map<String,String> link 两种消息转换的中间的联系map
     */
    public static RebateInfo filter(String jsonStr, Map<String,String> link) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        Gson gson=new Gson();
        Map map = gson.fromJson(jsonStr,new
                TypeToken<HashMap<String,Object>>(){}.getType());
        RebateInfo rebateInfo=new RebateInfo();
        for(String key:link.keySet()){
            Object o = map.get(link.get(key));
            RebateInfo.class.getMethod("set"+key.substring(0,1).toUpperCase()+key.substring(1),String.class).invoke(rebateInfo,o);
        }

        return rebateInfo;

    }
}

测试

    @Test
    public void test() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, ParseException {
        Gson gson=new Gson();
        CreateAccountMQ createAccount=new CreateAccountMQ("10001","江苏省镇江市",new Date(),"开户");
        Map<String,String > link=new HashMap<>();
        link.put("userId","number");
        link.put("bizId","number");
        link.put("bizDate","accountDate");
        link.put("desc","description");
        RebateInfo rebateInfo = MQAdapter.filter(gson.toJson(createAccount), link);
        System.out.println("适配前:");
        System.out.println(createAccount.toString());
        System.out.println("适配后:");
        System.out.println(rebateInfo.toString());

        System.out.println("----------------------------------------------------");
        OrderMQ orderMQ=new OrderMQ("10002","1054649795","10549779756999",new Date(),"订单");
        Map<String,String > link2=new HashMap<>();
        link2.put("userId","uId");
        link2.put("bizId","orderId");
        link2.put("bizDate","createOrderDate");
        link2.put("desc","desc");
        RebateInfo rebateInfo2 = MQAdapter.filter(gson.toJson(orderMQ), link2);
        System.out.println("适配前:");
        System.out.println(orderMQ.toString());
        System.out.println("适配后:");
        System.out.println(rebateInfo2.toString());

    }

结果:

适配前:
{"number":"10001","address":"江苏省镇江市","accountDate",Mon Oct 18 21:48:26 CST 2021,"description","开户"}
适配后:
RebateInfo{userId='10001', bizId='10001', bizDate=Oct 18, 2021 9:48:26 PM, desc='开户'}
----------------------------------------------------
适配前:
{"uId":"10002","goodId":"1054649795","orderId":"10549779756999","createOrderDate":Mon Oct 18 21:48:26 CST 2021}
适配后:
RebateInfo{userId='10002', bizId='10549779756999', bizDate=Oct 18, 2021 9:48:26 PM, desc='订单'}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霓乤

谢谢支持,菜鸟会继续努力..

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值