设计模式6:适配器模式(Adapter)

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

你可能感兴趣的:(设计模式6:适配器模式(Adapter))