2019独角兽企业重金招聘Python工程师标准>>>
今天,我们要梳理一下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