得心应手的“粘合剂”-适配器模式
定义
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法一起工作的两个类能够在一起工作
使用场景
- 系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容
- 想要建立一个可以重复使用的类,用于与彼此之间太大关联的一些类,包括一些可能在将来引进的类一起工作
- 需要一个统一的输出接口,而输入端的类型不可预知
简单实现
类适配器
target 角色
1
2
3
4
5
6
7
8
9
10
|
package AdapterMode.Class;
//target 角色
public interface FiveVolt {
public int getVolt5();
public class Volt220{
public int getVolt220(){
return 220;
}
}
}
|
适配器类
1
2
3
4
5
6
7
|
package AdapterMode.Class;
public class VoltAdapter extends FiveVolt.Volt220 implements FiveVolt {
public int getVolt5() {
return 5;
}
}
|
测试类
1
2
3
4
5
6
7
8
|
package AdapterMode.Class;
public class Test {
public static void main(String[] args) {
VoltAdapter voltAdapter=new VoltAdapter();
System.out.println("输出电压"+voltAdapter.getVolt5());
}
}
|
对象适配器
target角色
1
2
3
4
5
6
|
package AdapterMode.Object;
//target 角色
public interface FiveVolt {
public int getVolt5();
}
|
适配器角色,转换的角色
1
2
3
4
5
6
7
|
package AdapterMode.Object;
//adapter 角色,需要被转换的角色
public class Volt220 {
public int getVolt220(){
return 220;
}
}
|
适配器类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package AdapterMode.Object;
public class VoltAdapter implements FiveVolt {
Volt220 volt220;
public VoltAdapter(Volt220 adaptee){
volt220=adaptee;
}
public int getVolt220(){
return volt220.getVolt220();
}
public int getVolt5() {
return 5;
}
}
|
测试类
1
2
3
4
5
6
7
8
|
package AdapterMode.Object;
public class Test {
public static void main(String[] args) {
VoltAdapter voltAdapter=new VoltAdapter(new Volt220());
System.out.println("输出电压"+voltAdapter.getVolt5());
}
}
|
输出结果

总结
优点:
- 更好的复用性
系统需要使用现有的类,而此类的接口不符合系统的需要,那么通过适配器模式就可以让这些功能得到更好的复用
- 更好的拓展性
在实现适配器功能的时候,可以调用自己开发的功能,从而自然的拓展系统的功能
缺点:
- 过多地使用使用适配器,会使得系统非常凌乱,不易整体把握。
例如,明明看到的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此,如果不是很有必要,可以不使用适配器,而是直接使用对系统的重构。