- 将一个类的接口转换成客户希望的另外一个接口,使得原本因为接口不能兼容在一起工作的类变得可以在一起工作;
- 适配器模式分为类适配器模式和对象适配器模式;
结构
- 目标(Target)接口:当前系统业务所期待的接口,可以是接口或者抽象类;
- 适配者(Adaptee)类:它是被访问的和适配的现存组件库中的组件接口;
- 适配器(Adapter)类:它是一个转换器,通过继承或者引用适配者对象,把是配置者接口转换成目标接口,让客户根据目标接口的格式访问适配者。
类适配者模式
- 定义一个适配器类来实现当前系统的业务接口,同时又继承现有组件库中已经存在的组件。
- 实例:当前一台计算机可以读取SD卡中的内容,无法读取TF卡中的内容,利用适配器模式完成适配。
- 分析:根据需求,我们最终的目的是需要以SD卡的方式来读取TF卡中的内容,因此对于角色划分,SD卡数据目标而TF属于适配者。
// Computer.java
public class Computer {
// 从SD卡中读取数据
public String readSD(SDCard sdCard){
if(sdCard == null){
throw new NullPointerException("sd card is not null");
}
return sdCard.readSD();
}
}
// SDCard.java
public interface SDCard {
// 从SD卡中读取数据
public String readSD();
// 往SD卡中写数据
public void writeSD(String msg);
}
// SDCardImpl.java
public class SDCardImpl implements SDCard {
@Override
public String readSD() {
String msg = "SDCard read msg : hello world SD";
return msg;
}
@Override
public void writeSD(String msg) {
System.out.println("SDCard write msg : " + msg);
}
}
// TFCard.java
public interface TFCard {
// 从TF卡中读取数据
public String readTF();
// 往TF卡中写入数据
void writeTF(String msg);
}
// TFCardImpl.java
public class TFCardImpl implements TFCard{
@Override
public String readTF() {
String msg = "TFCard read msg : hello world TFCard";
return msg;
}
@Override
public void writeTF(String msg) {
System.out.println("TFCard write:" + msg);
}
}
// SDAdapterTF.java
public class SDAdapterTF extends TFCardImpl implements SDCard{
@Override
public String readSD() {
System.out.println("adapter read tf card");
return readTF();
}
@Override
public void writeSD(String msg) {
System.out.println("adapter write tf card");
writeTF(msg);
}
}
// Client.java
public class Client {
public static void main(String[] args) {
// 创建计算机对象
Computer computer = new Computer();
String msg = computer.readSD(new SDCardImpl());
System.out.println(msg);
System.out.println("==================");
// 使用该计算机读取TF卡中的数据卡
String msg1 = computer.readSD(new SDAdapterTF());
System.out.println(msg1);
}
}
- 类适配器模式违背了合成复用原则。
- 类适配器是目标类有一个接口规范下可用。
对象适配器模式
// SDAdapterTF.java
public class SDAdapterTF extends SDCardImpl {
// 声明适配者类
private TFCard tfCard;
public SDAdapterTF(TFCard tfCard){
this.tfCard = tfCard;
}
@Override
public String readSD() {
System.out.println("adapter read tf card");
return tfCard.readTF();
}
@Override
public void writeSD(String msg) {
System.out.println("adapter write tf card");
tfCard.writeTF(msg);
// Client.java
public class Client {
public static void main(String[] args) {
// 创建计算机对象
Computer computer = new Computer();
String msg = computer.readSD(new SDCardImpl());
System.out.println(msg);
System.out.println("==================");
// 读取TF卡中的数据
String msg1 = computer.readSD(new SDAdapterTF(new TFCardImpl()));
System.out.println(msg1);
}
}
- 对象适配器模式克服了上文说道的类适配器模式中的两个缺点。
网友评论