定义
适配器模式把一个类的接口变成客户端所期待的另一个接口,从而使原本不匹配而无法在一起工作的两个类能够在一起工作
使用场景
- 系统需要现有的类,而此类的接口不符合系统的需求,即接口不兼容。
- 想要建立一个可以重复使用的类,用于一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
- 需要一个统一的输出接口,但是输入端的类型不可预知。
UML 类图
适配器模式分为两种,类适配器模式和对象适配器模式
- 类适配器模式
classDiagram
Target <|.. Adapter
Adaptee <|-- Adapter
class Target{
<<interface>>
+operation1()
+operation2()
}
class Adapter{
+operation2()
}
class Adaptee{
+operation3()
}
- Target 目标角色,也就是所期待得到的接口。注意这里不是类
- Adaptee 现在需要适配的类
- Adapter 适配器,把现有的类适配成所需要的接口
类适配器简单实例
//Target 角色,需要5V电压
public interface FiveVolt{
int getVolt5();
}
//adaptee 角色,提供220V 电压
public class Vlot220{
pulic int getVlot220(){
return 220;
}
}
//adapter 角色,将220V 电压转换成5V 电压
public class VlotAdapter extends Vlot220 implements FiveVolt{
public int getVolt5(){
return 220to5Vlot();
}
private int 220to5Vlot(){
return 5;
}
}
//使用
public class Test{
public static void main(String[] args){
VlotAdapter adapter = new VlotAdapter();
adapter.getVolt5();
}
}
- 对象适配器
classDiagram
Target <|.. Adapter
Adaptee <.. Adapter
class Target{
<<interface>>
+operation1()
+operation2()
}
class Adapter{
+operation2()
}
class Adaptee{
+operation3()
}
从类图上可以看出,对类适配器和象适配器的不同主要是在Adapter 和 Adaptee 的关系上;前者是继承,后者是组合。
对象适配器简单实例
//adapter 角色
public class VoltAdapter implements FiveVolt{
Volt220 mVolt220;
public VoltAdapter(Volt220 adaptee){
mVolt220 = adaptee;
}
public int getVolt5(){
return 220to5Vlot();
}
private int 220to5Vlot(){
return 5;
}
}
//使用
public class Test{
public static void main(String[] args){
VlotAdapter adapter = new VlotAdapter(new Volt220());
adapter.getVolt5();
}
}
小结
这种实现方式直接将要被适配的对象床底到Adapter 中,使用组合的形式实现接口兼容的效果。这笔类适配器方式更灵活,它的另一个好处是被适配对象中的方法不会被暴露出去,类适配器模式由于继承了被适配对象,因此被适配对象的方法在Adapter 类中也会有,这使得Adapter 类会多出一些奇怪的方法,用户使用成本较高。因此,对象适配器更为灵活、实用。