适配器模式的本质是:转换匹配,复用功能
一、适配模式的定义:
将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器通过转换调用已有的实现,从而能把已有的实现匹配成需要的接口,使之能满足客户端的需要。也就是说转换匹配是手段,而复用已有的功能才是目的。
在进行转换匹配的过程中,适配器还可以在转换调用的前后实现一些功能处理,也就是实现智能的适配。
适配器模式类图
二、应用场景
适配器在生活中很常见,比如双孔插座转换成三孔插座、笔记本电脑上的电源将220V电压转换成笔记本可用的电压等。
在以下情况要以使用适配器模式:
1)希望使用某些现有类,但其接口其他代码不兼容时;
2)希望重用几个现有的子类,这些子类缺少一些不能添加到超类中的公共功能时。
三、适配器模式示例
假设客户端一直使用的两孔插座,现在要改为使用三孔插座,下面用代码进行示例:
1、两孔插座模拟类
public class TwoHole {
public void use() {
System.out.println("使用两孔插座");
}
}
2、客户端类
public class Client {
// 两孔插座
private TwoHole twoHole = new TwoHole();
/**
* 使用插座
*/
public void use() {
twoHole.use();
}
public static void main(String[] args) {
Client client = new Client();
client.use();
}
}
运行结果 :运行结果
现在需要使用三孔插座,改造如下:
1、适配器接口
public interface Adapter {
/**
* 使用两孔插座
* */
void useTwoHole();
/**
* 使用三孔插座
*/
void useThreeHole();
}
2、适配器实现
public class ThreeHoleAdapter implements Adapter {
// 包含两孔插座
private TwoHole twoHole;
public ThreeHoleAdapter(TwoHole twoHole) {
this.twoHole = twoHole;
}
@Override
public void useTwoHole() {
// 使用两孔插座
this.twoHole.use();
}
@Override
public void useThreeHole() {
System.out.println("使用三孔插座");
}
}
3、客户端类改造
public class Client1 {
// 两孔插座
private TwoHole twoHole = new TwoHole();
// 三孔插座适配器
private Adapter adapter = new ThreeHoleAdapter(twoHole);
/**
* 使用插座
*/
public void use() {
// 使用两孔插座
adapter.useTwoHole();
// 使用三孔插座
adapter.useThreeHole();
}
public static void main(String[] args) {
Client1 client = new Client1();
client.use();
}
}
改造后的客户端类可以自由地选择是使用两孔插座还是三孔插座。
四、适配器模式的优缺点
优点:
1)更好的复用性;
2)更好的扩展性,如果以后需要支持四孔插座,则扩展适配器即可。
缺点:
过多地使用适配器,会让系统非常零乱。