二、场景介绍建议把样例代码都实际的敲一遍,加深理解
三、代码样例本例子采取的是转换电压时候的样例,通过适配器将110V和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);
}
}
四、适配器模式的优缺点分析
优点
- 在不改变原来的类和方法的基础上,满足自己的使用需求,很好的实现了开闭原则。
- 适配器模式大量运用的话,会使得系统不好维护(此时就不如将系统重构了)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)