今天,我们要梳理一下java设计模式的适配器模式。
适配器嘛,想一想我们平常用的电源适配器就知道了,就是把两个不兼容的东西搞通嘛,可以相互联系。
在java中也一样,就是让两个需要一起协调的类,通过适配器协调起来就行了,就是讲一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
首先我们来看两个图,我们通常会有这样一个问题,厂商给我接口和我们现有接口对接不起来、旧的数据和新的数据接不起来等等。
解决这问题,在不改变原来两个接口的情况下,我们完全可以在写一个类,做个中间人,就像翻译官一样,我会两国语言,你们说话都经过我来就行了,这个适配器实现了你说期望的接口,而且这个类也能和厂商的接口沟通。
总而言之,我们经常可以看到适配器出现在我们的代码中,如在Android便充分利用了适配器来实现view和数据的联系,如:ListView和BaseAdapter。
我们举一下一个小例子来说明一下适配器模式。
就拿我们首页的图来看,
我们国家的标准电压是220v,而我们笔记本所需的电压就15v左右;所以肯定不可以把我们的交流电直接接到笔记本上,这时,我们得有一个变压器(电源适配器)就可以了,把220v电压转换成15v;
下面介绍一下代码:
笔记本类
/** * * 笔记本 * @author studyjun * */ public class Jotter { private VoltageAdapter adapter; public VoltageAdapter getAdapter() { return adapter; } public void inputVoltage(){ System.out.println("笔记本得到输入电压" +adapter.transformVoltage()+"v"); } public void setAdapter(VoltageAdapter adapter){ this.adapter =adapter; } }
供电器220v,提供220v的电压
/** * * 供电器 * @author studyjun * */ public class PowerSupplyDevice { //标准电压 private int standardVoltage =220; /** * 输出220v电压 * @return */ public int powerSupply(){ System.out.println("标准电压提供220v"); return standardVoltage; } }
适配器接口,有个电压转换接口
/** * * 电源适配器 * @author studyjun * */ public interface VoltageAdapter { /** * 转换电压 */ public int transformVoltage(); }
笔记本电源适配器类,把220v转为笔记本的15v的电压
/** * * 电源适配器 * @author studyjun * */ public class MyVoltageAdapter implements VoltageAdapter{ private int voltage; //电压 /** * 标准电压设备220v */ private PowerSupplyDevice powerSupplyDevice ; public MyVoltageAdapter(PowerSupplyDevice powerSupplyDevice) { this.powerSupplyDevice = powerSupplyDevice; } public int getVoltage() { return voltage; } public void setVoltage(int voltage) { this.voltage = voltage; } public PowerSupplyDevice getPowerSupplyDevice() { return powerSupplyDevice; } public void setPowerSupplyDevice(PowerSupplyDevice powerSupplyDevice) { this.powerSupplyDevice = powerSupplyDevice; } /** * 转换电压 */ public int transformVoltage(){ int voltage = powerSupplyDevice.powerSupply(); int lowerVoltage = voltage/14; System.out.println("转化中电压为="+lowerVoltage+"v"); return lowerVoltage; } }
测试
public class Test { public static void main(String[] args) { Jotter jt = new Jotter(); PowerSupplyDevice powerSupplyDevice = new PowerSupplyDevice(); VoltageAdapter adapter=new MyVoltageAdapter(powerSupplyDevice); jt.setAdapter(adapter); jt.inputVoltage(); } }
执行结果
讲到这里,我们总结一下适配器模式的优点和缺点:
优点:
1、可以将两个不同的接口联系起来,耦合性低。
2、增加了类的透明性和复用性,将具体的实现封装在适配者类中,对于客户端类来说是透明的,而且提高了适配者的复用性
3、灵活性和扩展性都非常好,符合开闭原则
类适配器的缺点:
1、对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为接口,不能为类,其使用有一定的局限性,不能将一个适配者类和他的子类同时适配到目标接口。
对象适配器还有的优点:
2、与类适配器模式相比,要想置换适配者类的方法就不容易。
源代码下载:DesignPattern