适配器模式
概述
定义
定义:将一个类的接口转换成用户期望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少。本篇先讲类适配器模式。
结构
适配器模式包含以下主要角色:
- 目标(Target)接口:当前系统业务所期待的接口,可以是抽象类或者接口
- 适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
- 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
UML图
接下来我们用一个现实生活中的例子来讲解适配器模式,例:现有一台电脑只能读取SD卡,而要读取TF卡中的内容的话就需要使用到适配器模式。创建一个读卡器,将TF卡中的内容读取出来。
类图如下:
图中,SDCard和SDCardImpl即为目标(Target)接口及其实现类;TFCard和TFCardImpl即为适配者(Adaptee)接口及其实现类;SDAdapterTF即为适配器(Adapter)类。
代码实现(Java)
- SDCard接口代码
package adapter;
public interface SDCard {
//从SD卡中读取数据
String readSD();
//从SD卡中写数据
void writeSD(String msg);
}
- SDCardImpl类代码
package adapter;
public class SDCardImpl implements SDCard {
@Override
public String readSD() {
String msg = "readSD() -> hello";
return msg;
}
@Override
public void writeSD(String msg) {
System.out.println("writeSD() : " + msg);
}
}
- TFCard接口代码
package adapter;
public interface TFCard {
//从TF卡中读取数据
String readTF();
void writeTF(String msg);
}
- TFCardImpl类代码
package adapter;
public class TFCardImpl implements TFCard {
@Override
public String readTF() {
String msg = "readTF() -> hello";
return msg;
}
@Override
public void writeTF(String msg) {
System.out.println("writeTF() : " + msg);
}
}
- SDAdapterTF类代码
package adapter;
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);
}
}
- Computer类代码
package adapter;
public class Computer {
//从SD卡中读取数据
public String readSD(SDCard sdCard) {
if(sdCard == null) {
throw new NullPointerException("sd card is not null");
}
return sdCard.readSD();
}
}
- Client类代码
package adapter;
public class Client {
public static void main(String[] args) {
//创建计算机对象
Computer computer = new Computer();
String msg = computer.readSD(new SDAdapterTF());
System.out.println(msg);
}
}
/*
控制台输出为:
adapter read tf card
readTF() -> hello
*/