小实验·设计模式-适配器模式

本文探讨了如何使用适配器模式来处理接口版本变更的问题。当旧接口参数与新接口不一致时,通过适配器对输入和输出进行转换,实现了旧版本与新版本的平滑过渡。示例中展示了如何为不同接口版本创建适配器,并在工厂类中调整返回的对象,以确保兼容性。适配器模式的应用有助于保持代码的整洁和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

书接上回:小实验·设计模式-简单工厂模式

上次立下的flag,这波来兑现了

 

重新捋一下场景:

我作为公共组件,对接的另外一个组件出现了版本变更,原来的接口已经不用了,需要使用新的接口代替;但需要同时兼容两个版本(版本切换有一个过程,需要逐渐过渡,所以存在一段时间不同的局点使用的组件版本或高或低)

上一次我介绍了如何在新接口和老接口的入参和返回参数都相同的情况下进行适配;

这一次,介绍一下如何在入参和返回参数不同的情况下进行适配;

(其实硬要兼容,强行写各种代码也能,只不过嘛,为了后期好维护,以及作为一个程序员的矜持,代码上稍微设计一下更爽,当然,好维护才是重点)

代码

假设,版本4的方法getName()入参是“String id”,而版本5的getName()入参是“String idJson”,就是版本4原来只要传递一个字符串就可以了,但是版本5这里需要的是json格式的字符串;

两个Service的差异

如下,serviceA中需要一个单纯的字符串而已

public class ServiceA implements IService {
    @Override
    public String getName( String id) {
        return "I am ServiceA,param is :"+ id;
    }
}

serviceB需要的是一个json格式的字符串


public class ServiceB implements IService {
    @Override
    public String getName(String jsonId) {
        return "I am ServiceB, param is :"+jsonId;
    }
}

适配器


public class Adaptor implements IService {
    ServiceB serviceB = new ServiceB();
    @Override
    public String getName(String param) {
        System.out.println("入参经过适配器翻译...");
        String jsonId = "{\"id\":\""+param+"\"}";
        serviceB.getName(jsonId);
        String result = serviceB.getName(jsonId);
        //如果返回的结果需要重新进行格式化处理,也可以在这一步进行
        result = formatResult(result);
        return result;
    }

    /**
     * 对结果进行格式化处理
     */
    private String formatResult(String result) {
        //do something
        System.out.println("对结果进行格式化处理");
        return result;
    }
}

可以看到,适配器中,就是对入参和出参进行了格式化,以满足新的接口的使用条件

工厂类调整

工厂类中对返回的serviceB实例进行调整,原来直接返回的一个serviceB对象,现在返回一个适配器

public class Factory {
    public static IService getService(boolean isServiceA)
    {
        if (isServiceA)
        {
            return new ServiceA();
        }
        return new Adaptor();
    }
}

效果

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值