适配器模式
应用场景
系统运行过程中,需要增加新的功能点,这个功能点需要调用另外一个毫不相干的接口,但是两个类之间参数无法满足调用关系,再为了不修改原来接口的情况下,增加一个适配器进行转换调用,类似的例子比如 内存卡需要读卡器转成Usb接口后才能读取数据
优点
1 可以减少类的编写,不用重复的去实现某一个类的逻辑
2 可以根据不同的类型编写不同的适配器,比较灵活
缺点
- 适配器的引入会增加系统的复杂度,特别是类直接的调用关系会因为适配器的加入会引发代码调用的混乱
注意点
不要在系统上设计的使用使用适配器,系统设计时应避免将代码之间的调用复杂化,可以再系统运行时,需要额外的添加功能时进行
例子
下面以读卡器为适配器的例子来说明
定义一个Usb接口,用来读取usb
package com.example.demo.study.adapter;
/**
* @Author zhanpeng
* @Date 2023/5/30 8:12
*/
public interface Usb {
void readUSBData();
}
定义一个upan类
package com.example.demo.study.adapter;
/**
* @Author zhanpeng
* @Date 2023/5/30 8:15
*/
public class Upan implements Usb{
@Override
public void readUSBData() {
System.out.println("读取u盘中的数据");
}
}
定义一个sdCard的接口接口,用来读取sd卡
package com.example.demo.study.adapter;
/**
* @Author zhanpeng
* @Date 2023/5/30 8:19
*/
public interface SdCardInterFace {
void readSdCardData();
}
定义一个适配器,sd卡能读取u盘中的数据
package com.example.demo.study.adapter;
/**
* @Author zhanpeng
* @Date 2023/5/30 8:22
*/
public class CardReaderAdapter implements Usb, SdCardInterFace{
private Usb usb = new Upan();
@Override
public void readUSBData() {
usb.readUSBData();
}
@Override
public void readSdCardData() {
System.out.println("读取内存卡中的数据");
readUSBData();
}
}
测试代码进行测试
public class AdapterTest {
//内存卡中需要读取u盘中的数据
public static void main(String[] args) {
SdCardInterFace sdCardInterFace = new CardReaderAdapter();
sdCardInterFace.readSdCardData();
}
}
运行结果
读取内存卡中的数据
读取u盘中的数据