设计模式之适配器模式
一、什么是适配器模式?
适配器模式(Adapter Pattern)属于结构型设计模式,它的作用是将一个类的接口转换成客户希望的另外一个接口。适配器让原本由于接口不兼容而不能一起工作的类可以协同工作(通俗的说就是转接口)。
二、角色组成
目标接口:定义一个可以播放多种格式文件的音频播放器接口。
适配者类:现有的音频播放器,只能播放 MP3 文件。
适配器类:它是一个转换器,创建一个新的类,实现目标接口,并在内部使用适配者类来播放 MP3 文件,同时添加对 VLC 和 MP4 文件的支持。
三、应用场景
1. 生活场景san
充电器接口转化:例如现有插头只是两插座的,但是充电器是三插座,此时,可以通过转换器将三插座转换成二插座进行充电。
2. Java场景
Java 中的 JDBC 通过适配器模式与不同类型的数据库进行交互。
四、实现
【例】读卡器
现有一台电脑只能读取SD卡,而要读取TF卡中的内容的话就需要使用到适配器模式。创建一个读卡器,将TF卡中的内容读取出来。
类图如下:
代码`
//yuanyuan
public interface SDCard {
//读取SD卡方法
String readSD();
//写入SD卡功能
void writeSD(String msg);
}
SD卡实现类(适配者类)!!!!
public class SDCardImpl implements SDCard {
public String readSD() {
String msg = "sd card read a msg :hello word SD";
return msg;
}
public void writeSD(String msg) {
System.out.println("sd card write msg : " + msg);
}
}
//电脑类
public class Computer {
public String readSD(SDCard sdCard) {
if(sdCard == null) {
throw new NullPointerException("sd card null");
}
return sdCard.readSD();
}
}
TF卡接口(目标接口)
public interface TFCard {
//读取TF卡方法
String readTF();
//写入TF卡功能
void writeTF(String msg);
}
//TF卡实现类
public class TFCardImpl implements TFCard {
public String readTF() {
String msg ="tf card read msg : hello word tf card";
return msg;
}
public void writeTF(String msg) {
System.out.println("tf card write a msg : " + msg);
}
}
定义适配器类(SD兼容TF)
public class SDAdapterTF extends TFCardImpl implements SDCard {
public String readSD() {
System.out.println("adapter read tf card ");
return readTF();
}
public void writeSD(String msg) {
System.out.println("adapter write tf card");
writeTF(msg);
}
}
//测试类
public class Client {
public static void main(String[] args) {
Computer computer = new Computer();
SDCard sdCard = new SDCardImpl();
System.out.println(computer.readSD(sdCard));
System.out.println("------------");
SDAdapterTF adapter = new SDAdapterTF();
System.out.println(computer.readSD(adapter));
}
}
分析
通过定义适配器类(SD兼容TF)实现了一台电脑只有能读取SD的功能然后在此基础上通过适配器类转化也能读取TF内容到电脑。实现了目标接口的转化。
优缺点
优点
促进了类之间的协同工作,即使它们没有直接的关联。
提高了类的复用性。
增加了类的透明度。
提供了良好的灵活性。
缺点
过度使用适配器可能导致系统结构混乱,难以理解和维护。
在Java中,由于只能继承一个类,因此只能适配一个类,且目标类必须是抽象的。