设计模式6:适配器模式(Adapter)
2019-04-23 本文已影响0人
ygxing
1. 简介
适配器模式,在已有的类和接口与其他类和接口不兼容的情况下,
复用已有的类和接口,兼容其他类和接口
1.1优点
- 两个不兼容的类和接口相互工作
- 类之间解耦,相互之间透明
1.2缺点
- 增加代码复杂度
1.3使用场景
- 系统架构升级,现有类和接口的改造
- 部分适用适配器模式的结构:例如,typeC适配器等
2. 实现方式
适配器模式分为:
- 类适配器模式
- 对象适配器模式
2.1 具体逻辑
有一台只有typeC接口的macbook,
需要连接USB2.0接口的设备,
我们就需要一个TypeC接口的适配器,
先将USB2.0设备接入到适配器中,
再把适配器接入macbook
2.2 类适配器实现
TypeCAdapter继承了USBMouse,并实现了ITypc接口,
每当有一个USB设备需要连接到TypeC接口,
我们都需要建一个适配器,
USB鼠标和设配器是绑定的,无法更换
2.2.1 TypeC接口
定义了typeC接口
一台只能连接typeC接口的macbook笔记本
/**
* typec 接口
*/
public interface ITypeC {
/**
* 连接TypeC设备
*/
void connectTypeC();
}
/**
* 只有typec接口的macbook
*/
public class TypeCMacBook {
/**
* 接入一个TypeC接口的设备
* @param typeC
*/
public void connectDevice(ITypeC typeC) {
typeC.connectTypeC();
System.out.println("一个typeC设备成功连接到macbook");
}
}
2.2.2 USB接口
定义了一个IUSB接口
一个USBMouse鼠标类实现了该接口
/**
* USB接口
*/
public interface IUSB {
/**
* 连接USB设备
*/
void connectUSB();
}
/**
* USB接口的鼠标类
*/
public class USBMouse implements IUSB {
/**
* USB鼠标连接到USB设备
*/
@Override
public void connectUSB() {
System.out.println("USBMouse连接到了USB接口");
}
}
2.2.3 TypeC适配器
一个绑定了USB鼠标的typeC设配器
/**
* typec接口适配器 继承了USBMouse类
*/
public class TypeCAdapter extends USBMouse implements ITypeC {
/**
* typeC适配器连接到TypeC设备
*/
@Override
public void connectTypeC() {
this.connectUSB();
System.out.println("TypeCAdapter连接了TypeC设备");
}
}
2.2.4 类图
观察者模式2.2.5 测试类
由于TypeCAdapter继承了USBMouse,并实现了ITypc接口,
所以每新增一个USB设备,我们都要实现一个TypeCAdapter,
这是方式不够灵活
//适配器模式测试
public class AdapterTest {
public static void main(String[] args) {
// USB鼠标插入到TypeC适配器中
ITypeC adapter = new TypeCAdapter();
// typeCAdapter插入到只有typeC接口的macbook中
TypeCMacBook mb = new TypeCMacBook();
mb.connectDevice(adapter);
}
}
运行结果:
USBMouse连接到了USB接口
TypeCAdapter连接了TypeC设备
一个typeC设备成功连接到macbook
2.3 对象适配器实现
TypeCAdapter并实现了ITypc接口,
构造方法传参为一个IUSB接口的对象,
也就是说,我们每次更换USB设备的时候,
只需要更换接入适配器的USB设备
2.3.1 TypeC接口
定义了typeC接口,
一台只能连接typeC接口的macbook笔记本
/**
* typec 接口
*/
public interface ITypeC {
/**
* 连接TypeC接口
*/
void connectTypeC();
}
/**
* 只有typec接口的macbook
*/
public class TypeCMacBook {
/**
* 接入一个TypeC接口的设备
* @param typeC
*/
public void connectDevice(ITypeC typeC) {
typeC.connectTypeC();
System.out.println("一个typeC设备成功连接到macbook");
}
}
2.3.2 USB接口
定义了一个IUSB接口
一个USBMouse鼠标类实现了该接口
/**
* USB接口
*/
public interface IUSB {
/**
* 连接USB设备
*/
void connectUSB();
}
/**
* USB接口的鼠标类
*/
public class USBMouse implements IUSB {
/**
* USB鼠标连接到USB设备
*/
@Override
public void connectUSB() {
System.out.println("USBMouse连接到了USB接口");
}
}
2.3.3 TypeC适配器
一个可以插入USB设备的TypeC适配器
/**
* typec接口适配器
*/
public class TypeCAdapter implements ITypeC {
private IUSB usb;
/**
* 传入需要连接到Adapter的USB设备
*/
public TypeCAdapter(IUSB usb) {
this.usb = usb;
}
/**
* typeC适配器连接到TypeC设备
*/
@Override
public void connectTypeC() {
// USB设备连接Adapter的USB接口
usb.connectUSB();
System.out.println("TypeCAdapter连接了TypeC设备");
}
}
2.3.4 类图
观察者模式2.3.5 测试类
通过对象适配器,
只要是USB接口的都可以连接到TypeC适配器中,
明显灵活了很多,更符合对现实的抽象
//适配器模式测试
public class AdapterTest {
public static void main(String[] args) {
// USB鼠标插入到TypeC适配器中
IUSB mouse = new USBMouse();
TypeCAdapter adapter = new TypeCAdapter(mouse);
// typeC adapter插入到只有typeC接口的macbook中
TypeCMacBook mb = new TypeCMacBook();
mb.connectDevice(adapter);
}
}
运行结果:
USBMouse连接到了USB接口
TypeCAdapter连接了TypeC设备
一个typeC设备成功连接到macbook