瞎说设计模式第五回:适配器模式
Posted 竹森技术分享
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了瞎说设计模式第五回:适配器模式相关的知识,希望对你有一定的参考价值。
上篇借着车子出厂前的检查测试,把建造者模式给讲了,同时又捎带着说了策略模式。今天继续说。
现在各大汽车厂商百花齐放,各种新款车型层出不穷,没办法,竞争压力太大了。但是也出现了新的问题:新款车出来之后,老款车怎么办?不能销毁啊,都是真金白银造出来的。
于是一些车厂就想了主意,采取降价+升级策略,同时以新款车的经典配置为由头进行出售。
领导层在提出升级策略之后,要求把旧款车型的小屏幕、黑白色的行车电脑,换成彩色液晶屏。那么问题来了,现有的液晶屏行车电脑所需要的接口规范,和旧款车型系统接口并不匹配,那怎么办?无论是重构旧款车的接口规范,还是重新定义现有彩色液晶屏的接口规范,那代价都太大了。
正在大家一筹莫展之际,车厂系统部架构师提出了一个想法:为旧款车系统接口和彩色液晶屏接口中间增加一个适配器不就好了!
对呀,在旧款车接口上层,增加一个适配器,匹配彩色液晶屏的规范,可供液晶屏调用获取信息就好了。
于是,就开始拿一辆旧款车做个实验。
先看看旧款车型的接口:
interface IOldCar {
//获取胎压信息
String getWheelState();
//获取发动机信息
String getEngine();
//获取车灯情况
String getLight();
//获取车门情况
String getDoorState();
//获取安全带情况
String getSafetyBelt();
//获取行驶里程
String getMileage();
}
再看看彩色液晶屏的接口规范:
interface ICarMultimedia {
//获取基本信息
Map getBaseMess();
//获取安全信息
Map getSafetyMess();
}
看起来新款彩色液晶屏的信息更加概括了。
拿一辆测试用的旧款车:
class OldCar implements IOldCar {
public String getWheelState() {
return "四个轮子的胎压正常";
}
public String getEngine() {
return "发动机正常";
}
public String getLight() {
return "远光灯开启";
}
public String getDoorState() {
return "后门没关";
}
public String getSafetyBelt() {
return "副驾驶安全带未系";
}
public String getMileage() {
return "总行驶里程1000km";
}
}
接下来,就是重点了,我们为旧款车型加装一个适配器:
class OldCarAdapter extends OldCar implements ICarMultimedia {
@Override
public Map getBaseMess() {
Map<String, String> baseMess = new HashMap<>();
baseMess.put("icm_wheel", super.getWheelState());
baseMess.put("icm_engine", super.getEngine());
baseMess.put("icm_light", super.getLight());
baseMess.put("icm_mileage", super.getMileage());
return baseMess;
}
@Override
public Map getSafetyMess() {
Map<String, String> safetyMess = new HashMap<>();
safetyMess.put("icm_door", super.getDoorState());
safetyMess.put("icm_safety_belt", super.getSafetyBelt());
return safetyMess;
}
}
看,这个适配器是继承了那辆旧款车,同时又实现了彩色液晶屏的接口。这样,应该就通用了吧,测试一下看看。
class TestAdapt {
public static void main(String [] args) {
ICarMultimedia media = new OldCarAdapter();
System.out.println("车辆基本信息:" + media.getBaseMess());
System.out.println("车辆安全信息:" + media.getSafetyMess());
}
}
输出结果:
车辆基本信息:{icm_engine=发动机正常, icm_mileage=总行驶里程1000km, icm_light=远光灯开启, icm_wheel=四个轮子的胎压正常}
车辆安全信息:{icm_door=后门没关, icm_safety_belt=副驾驶安全带未系}
OK,车辆信息完全合规呈现。
以上这种解决问题的思想,就是适配器模式。
后记:其实大家也看出来了,适配器模式,更适合在后期解决问题或者扩展的时候用得到。在开发阶段设计的时候,尽量还是少考虑它。
以上是关于瞎说设计模式第五回:适配器模式的主要内容,如果未能解决你的问题,请参考以下文章