总结一下适配器模式
一、引言
适配器模式是啥?为什么要有适配模式?适配模式怎么实现?
- 适配器模式是啥?将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 为什么要有适配器模式?例如买了个笔记本,充电需要20V电压,但是众所周知,我们国内电压为220V,因此需要个电源适配器来降压。如此,适配器也是这种作用。
二、实现适配器模式
实现适配器有三种方式:
- 类适配器
- 对象适配器
- 接口适配器
1. 类适配器,如下类图:
由上图可知,适配器实现了适配器接口,同时继承于220V电压,我们是(Client)客户端需要20V电压,只需要向适配器拿即可。
代码如下:
/**
* 220V电压类
*/
public class V220 {
public void pop220(){
System.out.println("释放了220V电压");
}
}
//--------------------------------------------------------
/**
* 适配器接口
*/
public interface Adapter {
public void pop();
}
/**
* 适配器类
* 继承于V220,同时实现适配器接口
*/
public class AdapterImpl extends V220 implements Adapter{
public void pop() {
super.pop220();
System.out.println("适配器接收220V电压转为20V,输出");
}
}
//-------------------------Main方法---------------------------
public static void main(String[] args) {
AdapterImpl adapter = new AdapterImpl();
//向适配器拿5V电压
adapter.pop();
}
运行结果为:
上面代码很简单,主要就是表达一种思想,如果调用不到想要的方法(pop220)可以用适配器中间加一层来调用。
不知道大家还是否记得设计模式七大原则——合成复用原则(说的是想要用一个类的方法,能用聚合就不要继承)。
而我们在适配器中,适配器继承了V220类,其实我们可以用聚合方式调用pop220方法。这种方式称为对象适配器。
2.对象适配器,如下类图:
类图和类适配器差不多,其实就是把继承改为聚合,减少耦合。
代码如下:
/**
* 适配器类
* 实现适配器接口(去掉继承转为聚合)
*/
public class AdapterImpl implements Adapter{
private V220 v220;
public AdapterImpl(V220 v220){
this.v220=v220;
}
public void pop() {
v220.pop220();
System.out.println("适配器接收220V电压转为20V,输出");
}
}
//-------------------------Main方法---------------------------
public static void main(String[] args) {
V220 v220 = new V220();//220V电压
AdapterImpl adapter = new AdapterImpl(v220);//聚合方式传入
//向适配器拿5V电压
adapter.pop();
}
运行结果还是一样,对象适配器和类适配器区别就在于类适配器是继承调用,对象适配器是聚合调用。
3.接口适配器
接口适配器适用于一个接口有很多方法,但是根据需求不需要全部实现,即可用接口适配器,相当于满足接口隔离原则。
类图如下:
看图很懵,现在我们来代码实现以下:
/**
* 电压接口(一共有3个方法)
*/
public interface Voltage {
public void V5();
public void V20();
public void V220();
}
//-------------------------------------------------------
/**
* 电压抽象类(实现电压接口)
* 这里对接口方法作空实现
*/
public abstract class VoltageImpl implements Voltage {
public void V5() {
}
public void V20() {
}
public void V220() {
}
}
//----------------------------Main------------------------------
public static void main(String[] args) {
//对抽象类进行实现
VoltageImpl voltage = new VoltageImpl() {
public void V5() {
System.out.println("输出5V电压");
}
};
voltage.V5();//输出5V
//--------------------------------------------------
//对抽象类进行实现
VoltageImpl voltage1 = new VoltageImpl() {
public void V20() {
System.out.println("输出20V电压");
}
};
voltage1.V20();
}
输出结果为:
以上可以看出,电压接口一共有3个方法,我们写一个抽象类实现它,然后对全部方法进行空实现,接着需要哪个方法就对抽象类进行实现就可以了,这就是接口隔离适配器。
三、结束
以上就是适配器的三种实现方式,每种都有对应的适用场景。