一、适配器模式
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);
}
}