前言
前面讲解完了设计模式中的创建性模式,本文开始讲解设计模式中的结构性模式之一:适配器模式。
一、适配器模式的是干什么的?
A类想要使用B类中的某些方法,但是不能直接使用,需要一个中间类对B类进行处理后,A类才能使用,这个中间类就是适配器,这种模式就是适配器模式。示意图如下。
既A类和B类之间夹了一个适配器类,适配器将B类传入的数据src进行处理,然后输出为A类需要使用的dst传给A类。
按照适配器如何接收B类的方式,将适配器模式分为三种模式,如果适配器类通过继承B类获得B类行为,则称为类适配器模式;如果直接将B类对象聚合到适配器类中,称为对象适配器模式;如果以接口的形式给到适配器类,则称之为接口适配器。
二、适配器模式案例
如我们有一个Voltage220v类只能输出220v的电压,但是现在我们要给手机充电,只能使用5V的电压,那么此时就需要一个适配器类VoltageAdapter首先将220v的电压转为5v,然后再给手机使用。三种适配器模式的实现如下:
1. 类适配器模式实现
- UML图如上所示,VoltageAdapter继承Voltage220v并实现IVoltage5v接口,然后手机再使用VoltageAdapter中输出的5V电压进行充电。
- 具体实现代码如下
public class Voltage220v {
public int output200v()
{
return 220;
}
}
public interface IVoltage5v {
public int output5v();
}
public class VoltageAdapter extends Voltage220v implements IVoltage5v{
@Override
public int output5v() {
int src = output200v();
int dis = src / 44;
return dis;
}
}
public class Phone {
public void charging(IVoltage5v iVoltage5v)
{
if (iVoltage5v.output5v() == 5)
{
System.out.printf("可以充电");
}
else
{
System.out.printf("不能充电");
}
}
}
public class client {
public static void main(String[] args) {
Phone phone = new Phone();
IVoltage5v iVoltage5v = new VoltageAdapter();
phone.charging(iVoltage5v);
}
}
2. 对象适配器模式实现
- 对象适配器UML图如上所示,与类适配器模式的区别就是对象适配器直接将Voltage220v对象聚合到了VoltageAdapter中,其余和类适配器模式思想一样。
3. 接口适配器模式实现
接口适配器核心思想是通过一个抽象类继承接口,并对所有的接口方法做默认空实现,那么该抽象类的子类就可以有选择的覆盖父类中的某些方法,而不必覆盖全部方法。