什么是适配器模式
适配器模式(
Adapter Pattern
)是两个不兼容的接口之间的桥梁,主要用来解决两个接口之间不兼容的问题,它不用改变原有接口,就可以使原来不能直接调用的接口变得可以调用。比如我们常见的转接头
、读卡器
其实就是充当着适配器这个角色。
适配器模式的三个角色
- 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口;
- 需要适配的类(Adaptee):需要适配的类;
- 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口;
优点
- 解耦,符合
开闭原则
; - 提高了类的复用性;
- 增加了类的透明度,易扩展,灵活性好;
缺点
- 如果使用类适配器,由于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口;
- 过多地使用适配器,会让系统非常零乱,不易整体进行把握;
常见的应用场景
- Java中的jdbc;
下面我们来模拟一个读卡器的适配过程
创建一个SD卡接口,以及实现类
public interface ISDCard {
/**
* 读取存SD卡
*/
String readSDCard();
}
public class SdCard implements ISDCard {
@Override
public String readSDCard() {
return "read sd card success";
}
}
创建一个计算机类,定义一个读取SD卡的方法
public class Computer {
public String readCard(ISDCard readCard){
return readCard.readSDCard();
}
}
然后来测试一下
public class Test {
public static void main(String[] args) {
Computer computer = new Computer();
IReadCard card = new SdCardImpl();
System.out.println(computer.readCard(card));;
}
}
接下来我们要在不改变计算机读取存储卡方法的前提下读取TF类型存储卡,我们该怎么做呢?下面我们来演示通过适配器模式来读取TF卡
通过适配器模式读取TF卡
创建TF卡接口及实现类
public interface ITFCard {
/**
* 读取存TF卡
*/
String readSDCard();
}
public class TFCard implements ITFCard {
@Override
public String readSDCard() {
return "read tf card success";
}
}
创建TF卡适配器并实现ISDCard
接口
public class TFCardAdapter implements ISDCard {
private TFCard tfCard;
public TFCardAdapter(TFCard tfCard) {
this.tfCard = tfCard;
}
@Override
public String readSDCard() {
return tfCard.readSDCard();
}
}
测试
public class Test {
public static void main(String[] args) {
Computer computer = new Computer();
ISDCard card = new SdCard();
System.out.println(computer.readCard(card));
ITFCard tfCard = new TFCard();
System.out.println(computer.readCard(new TFCardAdapter(tfCard)));
}
}
输出结果:
read sd card success
read tf card success