【设计模式】适配器模式样例与用法介绍
时间:2022-12-02 03:30:00
一、前言
建议实际敲击样例代码,加深理解
二、场景介绍
本例采用转换电压时的样本,110通过适配器V和220V转化为我们苹果的超快充:5V
三、代码样例
3.1、 输出接口的电压
public interface AC {
int outputAC(); }
3.2、 110V输出的实现类
public class AC110 implements AC {
public final int output = 110; @Override public int outputAC() {
return output; } }
3.3、 220V输出实现类
public class AC220 implements AC {
public final int output = 220; @Override public int outputAC() {
return output; } }
3.4、 场景分析
由于110和220V我们不能直接给手机充电,所以我们添加了一个适配器或实现我们需要的功能,而不改变原来的类别和方法) -> 开关原则)。
3.5、 定义适配器接口
public interface DC5Adapter {
/** * 检查输入电压和适配器是否匹配 */ boolean support(AC ac); /** * 将电压转换为5V后输出 */ int outputDC5V(AC ac); }
3.6、 220V制造适配器
public class ChinaPowerAdater implements DC5Adapter {
public static final int voltage = 220; @Override public boolean support(AC ac) {
return (voltage == ac.outputAC()); } @Override public int outputDC5V(AC ac) {
int adapterInput = ac.outputAC(); //变压器 int adapterOutput = adapterInput / 44; System.out.printf("使用中国的变压器,输入的AC为%sV,输出的DC为%sV%n", adapterInput, adapterOutput); return adapterOutput; } }
3.7、 110V适配器的制造
public class JapanPowerAdater implements DC5Adapter {
public static final int voltage = 110;
@Override
public boolean support(AC ac) {
return (voltage == ac.outputAC());
}
@Override
public int outputDC5V(AC ac) {
int adapterInput = ac.outputAC();
//变压器
int adapterOutput = adapterInput / 22;
System.out.printf("使用日本的变压器,输入的AC为%sV,输出的DC为%sV%n", adapterInput, adapterOutput);
return adapterOutput;
}
}
3.8、 适配器的使用方式举例
public class Test {
private List<DC5Adapter> adapters = Lists.newLinkedList();
public Test() {
this.adapters.add(new ChinaPowerAdater());
this.adapters.add(new JapanPowerAdater());
}
/** * 根据电压找合适的变压器 */
public DC5Adapter getPowerAdapter(AC ac) {
DC5Adapter adapter = null;
for (DC5Adapter ad : this.adapters) {
if (ad.support(ac)) {
adapter = ad;
break;
}
}
if (adapter == null) {
throw new IllegalArgumentException("没有找到合适的变压适配器呢,你没办法充电嘞,哈哈");
}
return adapter;
}
public static void main(String[] args) {
Test test = new Test();
//在中国正常的生活
AC chinaAc = new AC220();
DC5Adapter adapter = test.getPowerAdapter(chinaAc);
adapter.outputDC5V(chinaAc);
//去日本旅游几天
AC japanAc = new AC110();
adapter = test.getPowerAdapter(japanAc);
adapter.outputDC5V(japanAc);
}
}
四、适配器模式的优缺点分析
优点
- 在不改变原来的类和方法的基础上,满足自己的使用需求,很好的实现了开闭原则。
缺点
- 适配器模式大量运用的话,会使得系统不好维护(此时就不如将系统重构了)。