什么是适配器模式
想理解适配器模式,就要先知道什么是适配器。
手机充电器能够将家用220V
电压转换成5V
电压,给手机充电,充电器就是个适配器,电压适配器。
手机能够感知到适配器提供的5V
电压,但却无法感知到适配器背后的220V
电压。
“适配”就意味着信息转换,将现有信息状态转换成另一种信息状态。做转换工作的就是适配器,目的是为了重用现有的东西。
具体到代码设计层面,就是要重复利用现有代码,属于重复利用代码的一种设计模式。
适配器模式有一个比较特别的地方,那就是使用适配器模式,不会新增加系统的实体概念。
语言说不太明白,具体看下文代码理解吧,其实很简单。
适配器模式设计与实现
适合使用适配器模式的核心要点就是一个:
能够花费较小代价,将一个已经实现的东西,转换成另一个需要的东西
还是拿220V
电压转5V
电压的适配器举例吧,有两种实现方式:类适配器、对象适配器。
类适配器
这种实现方式,是利用了编程语言的多继承机制,C++
是多继承的,所以可以很方便的实现,但是Java
就会受限制,因为Java
只支持单继承,不支持多继承。
因此,如果是Java
语言,尽量不要使用类适配器的实现方式。
// 电压
public interface Voltage {
public int output();
}
// 220V:国家花大力气实现的
public class Voltage220 implements Voltage {
@Override
public int output() {
return 220;
}
}
// 5V:我现在需要的,用适配器模式转换
public class Voltage5 extends Voltage220 implements Voltage {
@Override
public int output() {
int output = super.output();// 国家的220V
return output / 44;// 转换成5V
}
}
Voltage5
满足需求,提供了5V
电压,但是电压它不是自己实现的,它是借助了Voltage220
,使用适配器模式将其转换成了需要的。
这就是适配器模式,没什么复杂的哈。
对象适配器
这种实现方式,使用的是对象聚合的概念,没有使用多继承机制,所以这是Java
语言的首选实现方式,C++
随意。
// 电压
public interface Voltage {
public int output();
}
// 220V:国家花大力气实现的
public class Voltage220 implements Voltage {
@Override
public int output() {
return 220;
}
}
// 5V:我现在需要的,用适配器模式转换
public class Voltage5 implements Voltage {
private Voltage voltage;// 国家实现
public Voltage5(Voltage voltage) {
this.voltage = voltage;
}
@Override
public int output() {
int output = voltage.output();// 国家的220V
return output / 44;// 转换成5V
}
}
对象适配器的实现方式不涉及继承机制,实现较为灵活,实现类的耦合性也比较低,建议首选。
总结
适配器模式特别简单,很多人都在用,但是很多人并不知道自己在用。