二十三种设计模式之适配器模式

1. 设计模式的分类

创建型模式(五种):工厂方法模式、单例模式、抽象工厂模式、原型模式、建造者模式。

结构型模式(七种):适配器模式、代理模式、装饰器模式、桥接模式、外观模式、享元模式、组合模式。

行为型模式(十一种):状态模式、模板方法模式、访问者模式、迭代子模式、责任链模式、备忘录模式、解释器模式、命令模式、中介者模式、观察者模式、策略模式。

2. 为什么要引入适配器模式?

在软件开发的海洋中,我们经常会遇到各种不同的系统和组件,它们可能由于设计时的考虑不周或技术演进导致接口不兼容。这时,适配器模式(Adapter Pattern)就成为了我们解决问题的利器。

3. 什么是适配器模式?

适配器模式是一种结构型设计模式,它允许将一个类的接口转换成客户端期望的另一个接口。适配器让那些接口不兼容的类可以一起工作,从而提高了类的复用性。

最常见的比喻是电源适配器。当你出国旅行时,可能会遇到电源插座与你的电子设备充电器不匹配的情况。这时,你需要一个电源适配器来转换插头的形状和电压,使得你的充电器能够适应当地的电源插座。在这个比喻中:

  • 目标接口:是你电子设备的充电器接口。
  • 被适配者:是目的地国家的电源插座。
  • 适配器:是实际的电源适配器,它连接了两者。

4. 适配器模式的分类

适配器模式主要分为两种类型:

  1. 类适配器模式:通过多重继承将一个类的接口转换成另一个接口。在不支持多重继承的语言中,通常使用组合的方式来实现。

  2. 对象适配器模式:通过创建一个包装对象,将请求从一个对象传递到另一个对象。

5. 类适配器模式

5.1 组件

  • Target(目标接口):客户端期望的接口。
  • Adaptee(被适配者):需要适配的类,其接口与目标接口不兼容。
  • Adapter(适配器):继承Adaptee并实现Target接口。

5.2 示例

假设我们有一个旧的系统,它提供了一个Adaptee类,该类有一个specificRequest方法。现在,我们需要在新的系统中使用这个类,但新系统的接口是Target接口,它期望有一个request方法。

java 复制代码
// 目标接口
public interface Target {
    void request();
}

// 被适配者
public class Adaptee {
    public void specificRequest() {
        System.out.println("Specific Request");
    }
}

// 适配器
public class Adapter extends Adaptee implements Target {
    @Override
    public void request() {
        specificRequest();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Target target = new Adapter();
        target.request();
    }
}

在这个例子中,Adapter类继承了Adaptee类并实现了Target接口,使得原本不兼容的Adaptee类可以通过Adapter来满足Target接口的需求。

6. 对象适配器模式

6.1 组件

  • Target(目标接口):客户端期望的接口。
  • Adaptee(被适配者):需要适配的类。
  • Adapter(适配器):持有Adaptee的引用并实现Target接口。

6.2 示例

对象适配器模式与类适配器模式的主要区别在于,对象适配器模式使用组合而非继承。

java 复制代码
// 目标接口
public interface Target {
    void request();
}

// 被适配者
public class Adaptee {
    public void specificRequest() {
        System.out.println("Specific Request");
    }
}

// 适配器
public class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void request() {
        adaptee.specificRequest();
    }
}

// 客户端代码
public class Client {
    public static void main(String[] args) {
        Adaptee adaptee = new Adaptee();
        Target target = new Adapter(adaptee);
        target.request();
    }
}

7. 适配器模式的应用场景

适配器模式通常用于以下场景:

  1. 系统需要使用一些现有的类,而这些类的接口不符合系统的需要。
  2. 想要建立一个可重复使用的类,用来与一些彼此之间没有太大关系的类一起工作,包括一些可能在将来引进的类。

8. 适配器模式的优点

  • 提高类的复用性:通过适配器模式,我们可以重用现有的类,而不需要修改它们的代码。
  • 解耦系统组件:适配器模式提供了一个中间层,使得系统组件之间的依赖关系减少,提高了系统的灵活性。

9. 适配器模式的缺点

  • 增加系统的复杂性:如果过度使用适配器模式,可能会使得系统结构变得复杂,增加理解和维护的难度。

10. 结论

适配器模式是一种强大的设计模式,它可以帮助我们在不修改原有代码的情况下,实现不同系统或组件之间的协同工作。通过合理地使用适配器模式,我们可以提高软件的复用性和灵活性,但也要注意避免过度使用,以免增加系统的复杂性。

相关推荐
java_heartLake8 小时前
设计模式之工厂方法模式
java·设计模式·工厂方法模式
我码玄黄1 天前
JS 的行为设计模式:策略、观察者与命令模式
javascript·设计模式·命令模式
会敲代码的小张1 天前
设计模式-观察者模式
java·开发语言·后端·观察者模式·设计模式·代理模式
宗浩多捞1 天前
C++设计模式(更新中)
开发语言·c++·设计模式
秦哈哈1 天前
【软件设计】常用设计模式--观察者模式
观察者模式·设计模式
蔚一1 天前
Java设计模式—面向对象设计原则(四) ----->接口隔离原则(ISP) (完整详解,附有代码+案例)
java·后端·设计模式·intellij-idea·接口隔离原则
严文文-Chris1 天前
【设计模式-外观】
android·java·设计模式
yyqzjw1 天前
【设计模式】观察者模式
算法·观察者模式·设计模式
Tech_gis1 天前
C++ 常用设计模式
设计模式
java_heartLake1 天前
设计模式之抽象工厂模式
设计模式·抽象工厂模式