瞎说设计模式第五回:适配器模式

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 { @Override public String getWheelState() { return "四个轮子的胎压正常"; }
@Override public String getEngine() { return "发动机正常"; }
@Override public String getLight() { return "远光灯开启"; }
@Override public String getDoorState() { return "后门没关"; }
@Override public String getSafetyBelt() { return "副驾驶安全带未系"; }
@Override 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,车辆信息完全合规呈现。


以上这种解决问题的思想,就是适配器模式。



后记:其实大家也看出来了,适配器模式,更适合在后期解决问题或者扩展的时候用得到。在开发阶段设计的时候,尽量还是少考虑它。

以上是关于瞎说设计模式第五回:适配器模式的主要内容,如果未能解决你的问题,请参考以下文章

第五回. $e$ 的引入

NEXT讲坛第五回丨玩转Canvas 动画!

瞎说设计模式第七回:组合模式

Docker第五回(Docker存储卷)

一起Talk Android吧(第五百一十五回:绘制向外扩散的水波纹)

软件构造第五章第三节 可复用的设计模式