章节目录:
一、适配器模式介绍
适配器模式(Adapter Pattern):别名为包装器(Wrapper),是将某个类的接口转换成客户端期望的另一个接口表示。主要目的是兼容性,让原本因接口不能匹配不能一起工作的两个类可以协同工作。
适配器模式属于结构型模式。
主要分为三类:
- 类适配器模式
- 对象适配器模式
- 接口适配器模式
工作原理: 用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法。
接下来以生活中充电的例子说明该模式:诉求是将220V的交流电通过适配器输出目标为5V的电压,使得能够满足手机正常充电。
二、类适配器模式
2.1 示例关系:
2.2 代码实现:
/* *
* 被适配者:220V电压。
*/
class Voltage220V {
public int outPut220V() {
return 220;
}
}
/* *
* 输出目标:5v电压。
*/
interface IVoltage5V {
int outPut5V();
}
/* *
* 适配器。
*/
class VoltageAdapter extends Voltage220V implements IVoltage5V {
@Override
public int outPut5V() {
Voltage220V voltage220V = new Voltage220V();
int srcV = voltage220V.outPut220V();
int tarV = srcV / 44;
System.out.println("使用适配器转换电压:转换前为" + srcV + "V," +
"转换后为" + tarV + "V。");
return tarV;
}
}
class Phone {
public void charging(IVoltage5V iVoltage5V) {
int curV = iVoltage5V.outPut5V();
System.out.println("手机充电中...当前电压为:" + curV + "V。");
}
}
/* *
* 使用[类适配器]模式进行转换。
*/
public class Client {
public static void main(String[] args) {
Phone phone = new Phone();
phone.charging(new VoltageAdapter());
// 使用适配器转换电压:转换前为220V,转换后为5V。
// 手机充电中...当前电压为:5V。
}
}
2.3 方式说明:
该模式会使用到继承,因此被适配的类方法会被暴露,增加了使用的成本。
同样因为采用继承,适配器可以重写被适配类的方法,它在一定程度上是具备灵活性的。
三、对象适配器
3.1 示例关系:
3.2代码实现:
/* *
* 被适配者:220V电压。
*/
class Voltage220V {
public int outPut220V() {
return 220;
}
}
/* *
* 输出目标:5v电压。
*/
interface IVoltage5V {
int outPut5V();
}
/* *
* 适配器。
*/
class VoltageAdapter implements IVoltage5V {
/* *
* 使用组合的方式
*/
private final Voltage220V voltage220V;
public VoltageAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public int outPut5V() {
int srcV = voltage220V.outPut220V();
int tarV = srcV / 44;
System.out.println("使用适配器转换电压:转换前为" + srcV + "V," +
"转换后为" + tarV + "V。");
return tarV;
}
}
class Phone {
public void charging(IVoltage5V iVoltage5V) {
int curV = iVoltage5V.outPut5V();
System.out.println("手机充电中...当前电压为:" + curV + "V。");
}
}
/* *
* 使用[对象适配器]模式进行转换。
*/
public class Client {
public static void main(String[] args) {
Phone phone = new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
// 使用适配器转换电压:转换前为220V,转换后为5V。
// 手机充电中...当前电压为:5V。
}
}
3.3 方式说明:
基本思路同类适配器模式相同,只是根据“合成复用原则”,在适配器中使用到了关联关系来代替继承。
四、接口适配器
4.1 示例关系:
4.2 代码实现:
/* *
* 被适配者:220V电压。
*/
class Voltage220V {
public int outPut220V() {
return 220;
}
}
/* *
* 提供各种转化方法的电压接口。
*/
interface IVoltage {
void conversionTo5V();
void conversionTo18V();
void conversionTo50V();
}
/* *
* 抽象适配器-以缺省方式实现电压接口中的方法。
*/
abstract class AbsAdapter implements IVoltage {
/* *
* 使用组合的方式。
*/
Voltage220V voltage220V;
public AbsAdapter(Voltage220V voltage220V) {
this.voltage220V = voltage220V;
}
@Override
public void conversionTo5V() {
}
@Override
public void conversionTo18V() {
}
@Override
public void conversionTo50V() {
}
}
class Phone {
public void charging(int voltage) {
System.out.println("手机充电中...当前电压为:" + voltage + "V。");
}
}
/* *
* 使用[接口适配器]模式进行转换。
*/
public class Client {
public static void main(String[] args) {
// 选择性地实现需要覆盖方法。
new AbsAdapter(new Voltage220V()) {
// 此处只用到了将电压转化为5V的方法。
@Override
public void conversionTo5V() {
int srcV = voltage220V.outPut220V();
int tarV = srcV / 44;
System.out.println("使用适配器转换电压:转换前为" + srcV + "V," +
"转换后为" + tarV + "V。");
Phone phone = new Phone();
phone.charging(tarV);
}
}.conversionTo5V();
// 使用适配器转换电压:转换前为220V,转换后为5V。
// 手机充电中...当前电压为:5V。
}
}
4.3 方式说明:
该模式也称作缺省适配器模式。
核心思路: 当不需要全部实现接口提供的方法时,可以先设计一个抽象类实现接口,并为该接口每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择地覆盖父类的某些方法来实现需求。
适用于一个接口不想使用其所有的方法的情况。
五、总结
类适配器:将被适配类充当Adapter继承源(继承)。
对象适配器:将被适配类以对象的形式关联Adapter(持有)。
接口适配器:以接口形式给到Adapter,Adapter进行选择地实现(实现)。
六、结束语
“-------怕什么真理无穷,进一寸有一寸的欢喜。”
微信公众号搜索:饺子泡牛奶。