系列二十五、Spring设计模式之适配器模式

一、适配器模式

1.1、概述

       适配器模式(Adapter Pattern)用于兼容不相关的接口之间,类似于一个桥梁,它结合了两个独立接口的功能,这种类型的设计属于结构型模式,为了方便大家伙的理解,我举个例子,例如:国产的电源适配器标准输出电压是220v,美国人购买该电源适配器后显然无法直接使用(美国标准输出电压110v,PS:不怕把电脑充冒烟可以直接使用!),那么这个时候可以使用一个适配器将国产充电器的电压转换为美国标准电压后再进行使用,这是生活中最常见的一个场景 ,类似的场景还有很多,欢迎大家点赞+留言+举例!作为23种设计模式之一的适配器模式(Adapter Pattern),在Java中有着广泛的应用,例如:基于IO流的BufferedInputStream、BufferedOutputStream,基于SpringMVC的各种HandlerAdapter(处理器适配器),那么工作中我们应该怎么使用适配器模式助力开发呢?下面进入实战演示环节

1.2、组成要素

  • Target:客户期望获得的功能(例如:美国人需要110v的电压);
  • Client:客户。通过访问Target接口来获取期望的功能(110v电压);
  • Adaptee:现有接口(例如:当前国产电源适配器的标准输出电压为220v),需要被适配;
  • Adapter:适配器类,适配现有接口使其符合客户需求

        结构图如下:

1.3、思想

        适配器提供和现有接口相同的功能,即输出电压,但是在输出电压时将现有接口注入,然后在适配器实现中对现有接口的功能进行处理,得到预期结果;

1.4、案例代码

1.4.1、项目概览

1.4.2、pom

同 系列二十四、Spring设计模式之策略模式 # pom

1.4.3、ChinaChargerAdaptee

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/30 9:46
 * @Description: 中国充电器标准输出电压220v
 */
public interface ChinaChargerAdaptee {

    /**
     * 输出电压
     * @return
     */
    String outputVoltage();

}

1.4.4、ChinaChargerAdapteeImpl

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/30 9:47
 * @Description:
 */
@Component
public class ChinaChargerAdapteeImpl implements ChinaChargerAdaptee {

    @Override
    public String outputVoltage() {
        return "220";
    }
}

1.4.5、ChargerAdapter

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/30 9:52
 * @Description: 电源适配器
 */
public interface ChargerAdapter {

    /**
     * 输出电压
     * @return
     */
    String outputVoltage();

}

1.4.6、AmericanChargerAdapter

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/30 9:51
 * @Description:
 */
@Component(value = "American")
public class AmericanChargerAdapter implements ChargerAdapter {

    @Resource
    private ChinaChargerAdaptee chinaChargerAdaptee;

    @Override
    public String outputVoltage() {
        System.out.println("购买一个电源充电器,原始标准输出电压:" + chinaChargerAdaptee.outputVoltage());
        // 模拟电压转换
        String adapterVoltage = String.valueOf(Integer.valueOf(chinaChargerAdaptee.outputVoltage()) - 110);
        System.out.println("电压适配美国标准电压后的输出电压:" + adapterVoltage);
        return "【美国】输出标准电压" + adapterVoltage;
    }
}

1.4.7、IndiaChargerAdapter

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/30 9:51
 * @Description:
 */
@Component(value = "India")
public class IndiaChargerAdapter implements ChargerAdapter {

    @Resource
    private ChinaChargerAdaptee chinaChargerAdaptee;

    @Override
    public String outputVoltage() {
        System.out.println("购买一个【中国制造】的电源充电器,原始标准输出电压:" + chinaChargerAdaptee.outputVoltage());
        // 模拟电压转换
        String adapterVoltage = String.valueOf(Integer.valueOf(chinaChargerAdaptee.outputVoltage()) + 10);
        System.out.println("电压适配印度标准电压后的输出电压:" + adapterVoltage);
        return "【印度】输出标准电压:" + adapterVoltage;
    }
}

1.4.8、JapanChargerAdapter

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/30 9:51
 * @Description:
 */
@Component(value = "Japan")
public class JapanChargerAdapter implements ChargerAdapter {

    @Resource
    private ChinaChargerAdaptee chinaChargerAdaptee;

    @Override
    public String outputVoltage() {
        System.out.println("购买一个【中国制造】的电源充电器,原始标准输出电压:" + chinaChargerAdaptee.outputVoltage());
        // 模拟电压转换
        String adapterVoltage = String.valueOf(Integer.valueOf(chinaChargerAdaptee.outputVoltage()) - 120);
        System.out.println("电压适配日本标准电压后的输出电压:" + adapterVoltage);
        return "【日本】输出标准电压:" + adapterVoltage;
    }
}

1.4.9、NationParam

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/30 10:35
 * @Description:
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
@ToString(callSuper = true)
public class NationParam implements Serializable {

    private String nationType;

}

1.4.10、AdapterService

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/30 10:21
 * @Description:
 */
public interface AdapterService {

    /**
     * 输出电压
     * @param param
     * @return
     */
    String outputVoltage(NationParam param);

}

1.4.11、AdapterServiceImpl

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/30 10:21
 * @Description:
 */
@Service
public class AdapterServiceImpl implements AdapterService {

    @Override
    public String outputVoltage(NationParam param) {
        ChargerAdapter chargerAdapter = SpringUtil.getBean(param.getNationType(), ChargerAdapter.class);
        return chargerAdapter.outputVoltage();
    }
}

1.4.12、AdapterController

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2023/11/30 10:18
 * @Description:
 */
@RestController
public class AdapterController {

    @Resource
    private AdapterService adapterService;
    @PostMapping("/outputVoltage")
    public String outputVoltage(@RequestBody NationParam param) {
        return adapterService.outputVoltage(param);
    }

}

1.4.13、测试

  • 40
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值