说明
适配器模式(Adapter Pattern) 是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
适配器模式的产生环境:例如出差时,会遇到欧标的插座,那么我们国标的插头就无法使用,这时就需要买一个插座转换器,将欧标的插孔转换成国标的插孔。国标插孔则是输出;
适配主要分为三类:类适配器、对象适配器、接口适配器;
类适配器模式
说明:类适配器是创建一个Adapter类去继承被适配的类(欧标插座),并且Adapter类需要实现最终输出的类(这个类定义一个方法,返回国标插座);
如下举例:
我们生活中的手机充电器,将220v电压转为5v的电压
上面的类图中,使用了依赖倒置原则;phone和VoltageAdapter者两个类本来是该直接依赖的,但是phone是依赖的voltage这个接口类。
Voltage5V:是一个接口,方法是返回一个5V结果;
Voltage220V:是一个已存在的220V类;
VoltageAdapter:是个适配器,它会继承Voltage220V和实现Voltage5V,最终返回5V结果;
Phone:聚合了Voltage5V,它的目标就是拿到5V电压;
/**
* 定义一个220V电压
*/
public class Voltage220V {
public int get220v(){
System.out.println("被适配者220V电压");
return 220;
}
}
/**
* 定义返回5V结果
*/
public interface Voltage5V {
int get5v();
}
/**
* 电压转换类,220v到5v
*/
public class VoltageAdapter extends Voltage220V implements Voltage5V{
public int get5v() {
System.out.println("电压转换中。。。。");
return get220v() / 44;
}
}
/**
* 手机获取5V电压
*/
public class Phone {
int voltage;
public Phone(int voltage) {
this.voltage = voltage;
}
@Override
public String toString() {
return "Phone{" +
"voltage=" + voltage +
'}';
}
}
public class Client {
public static void main(String[] args) {
System.out.println(new Phone(new VoltageAdapter().get5v()));
}
}
对象适配器模式
和上面的类适配器模式的区别:
类适配模式中Adapter是去继承的220v电压的那个类,而对象适配器模式是Adapter聚合220v电压的这个类。
根据合成复用原则:类最好是通过聚合、组合、依赖,尽量不要继承,所以对象适配器模式是常用的适配器模式。
接口适配器模式
接口适配器模式和上面的两种模式侧重点不一样,接口适配器模式重点在于是使用者会使用到多少个接口中的方法,这里的适配器是对方法数量的一个控制。
举例:如果接口类A中定义了10个方法,使用者B类会使用到A类中的5个方法,其他5个方法不需要使用,对于这种情况,就可以建一个C类(抽象类),去实现A类,重写A类中的10个方法(只需要定义一个空方法),这样B类再继承C类,B类重写自己所需要的的5个方法就行了。