适配器模式
概念
适配器模式是一种结构型设计模式,它能使接口不兼容的对象能够相互合作。
适配器模式(Adapter)的定义:将一个接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如:
- 讲中文的人同讲英文的人对话时需要一个翻译;
- 用直流电的笔记本电脑接交流电源时需要一个电源适配器;
- 用计算机访问照相机的SD内存卡时需要一个读卡器等。
在软件设计中也可能出现:需要开发的具有某种业务功能的组件,在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题。
对象适配器
实现时使用了构成原则:适配器实现了其中一个对象的接口,并对另一个对象进行封装。所有流行的编程语言都可以实现适配器。
对象适配器实例
用直流电的笔记本电脑接交流电源时需要一个电源适配器:
package structural.object_adapter;
/**
* Source类
*/
public class AC220V {
public int output220V() {
return 220;
}
}
目标类Destination:
package structural.object_adapter;
public interface DC5V {
int output5V();
}
适配器:
package structural.object_adapter;
public class PowerAdapter implements DC5V {
/**
* 封装AC220V
*/
private AC220V ac220V;
public PowerAdapter(AC220V ac220V) {
this.ac220V = ac220V;
}
/**
* 实现DC5V接口
*/
@Override
public int output5V() {
int output = 0;
if (ac220V != null) {
output = ac220V.output220V() / 44;
}
return output;
}
}
客户使用:
package structural.object_adapter;
public class Client {
public static void main(String[] args) {
// 用户需将适配器插入220V的插座上
DC5V dc5V = new PowerAdapter(new AC220V());
System.out.println(dc5V.output5V());
}
}
类适配器
这一实现使用了继承机制:适配器同时继承两个对象的接口。这种方式仅能在支持多重继承的编程语言中实现,例如 C++。
类适配器实例
用直流电的笔记本电脑接交流电源时需要一个电源适配器:
package structural.class_adapter;
// Source类
public class AC220V {
public int output220V() {
return 220;
}
}
目标类Destination:
package structural.class_adapter;
public interface DC5V {
int output5V();
}
适配器:
package structural.class_adapter;
public class PowerAdapter extends AC220V implements DC5V {
@Override
public int output5V() {
return output220V() / 44;
}
}
客户使用:
package structural.class_adapter;
public class Client {
public static void main(String[] args) {
PowerAdapter adapter = new PowerAdapter();
System.out.println(adapter.output5V());
}
}