1. 设计模式之适配器模式:适配老版本接口和第三方接口

1.1. 介绍

适配器模式(Adapter Pattern)充当两个不兼容接口之间的桥梁,属于结构型设计模式。它通过一个中间件(适配器)将一个类的接口转换成客户期望的另一个接口,使原本不能一起工作的类能够协同工作。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

适配器模式是一种软件设计模式,旨在解决不同接口之间的兼容性问题。将一个类的接口转换为另一个接口,使得原本不兼容的类可以协同工作

应用实例举例

  • 电压适配器:将 110V 电压转换为 220V,以适配不同国家的电器标准。
  • 接口转换:例如,将 Java JDK 1.1 的 Enumeration 接口转换为 1.2 的 Iterator 接口。
  • 跨平台运行:在Linux上运行Windows程序。
  • 数据库连接:Java 中的 JDBC 通过适配器模式与不同类型的数据库进行交互。

优缺点及建议

适配器模式可以清晰地表达其核心概念和应用,同时避免了不必要的复杂性。

优点 
1.促进了类之间的协同工作,即使它们没有直接的关联。
2.提高了类的复用性。
3.增加了类的透明度。
4.提供了良好的灵活性。

缺点
1.过度使用适配器可能导致系统结构混乱,难以理解和维护。
2.在Java中,由于只能继承一个类,因此只能适配一个类,且目标类必须是抽象的。

使用建议
1.适配器模式应谨慎使用,特别是在详细设计阶段,它更多地用于解决现有系统的问题。
2.在考虑修改一个正常运行的系统接口时,适配器模式是一个合适的选择。

1.2. 实现及相关代码

假设有一个业务,有新接口和老接口,但是别人调用或者第三方调用,都是以新接口方式来调用,这时可以使用适配器模式将老接口做一层封装。

1.2.1. 没使用设计模式方式

接口及数据对象

/** 老版本接口 */
public interface OldInterface {
    void oldExecute();
}

/** 老版本接口的实现类 */
public static class OldInterfaceImpl implements OldInterface {
    public void oldExecute() {
        System.out.println("老版本接口实现的功能逻辑");
    }
}

/** 新版本接口 */
public interface NewInterface {
    void newExecute();
}

/** 新版本接口的实现类 */
public static class NewInterfaceImpl implements NewInterface {
    public void newExecute() {
        System.out.println("新版本接口实现的功能逻辑");
    }
}

调用方法

public static void main(String[] args) {
    OldInterface oldObject = new OldInterfaceImpl();
    NewInterface newObject = new NewInterfaceImpl();
    oldObject.oldExecute();
    newObject.newExecute();
}

可能会遇到的问题

其他业务或者第三方调用的时候,需要同时关心你新版本和老版本的接口,对于调用方不友好,耦合比较严重。

1.2.2. 使用设计模式方式

将老版本通过适配器方式封装,按新版本的方式来调用,这样对于调用方调用的方式就完全一致了,不需要关心老的接口结构,对外部方式统一,方便调用及维护。

接口及数据对象

/** 定义一个适配器类 */
public static class NewInterfaceAdapter implements NewInterface {

    private OldInterface oldObject;

    public NewInterfaceAdapter(OldInterface oldObject) {
        this.oldObject = oldObject;
    }

    public void newExecute() {
        oldObject.oldExecute();
    }

}

/** 老版本接口 */
public interface OldInterface {
    void oldExecute();
}

/** 老版本接口的实现类 */
public static class OldInterfaceImpl implements OldInterface {
    public void oldExecute() {
        System.out.println("老版本接口实现的功能逻辑");
    }
}

/** 新版本接口 */
public interface NewInterface {
    void newExecute();
}

/** 新版本接口的实现类 */
public static class NewInterfaceImpl implements NewInterface {
    public void newExecute() {
        System.out.println("新版本接口实现的功能逻辑");
    }
}

调用方法

public static void main(String[] args) {
    NewInterface oldObject = new NewInterfaceAdapter(new OldInterfaceImpl());
    NewInterface newObject = new NewInterfaceImpl();
    oldObject.newExecute();
    newObject.newExecute();
}

results matching ""

    No results matching ""