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

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. 结论

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

相关推荐
o0向阳而生0o3 小时前
112、23种设计模式之命令模式(20/23)
设计模式·命令模式
将编程培养成爱好4 小时前
C++ 设计模式《外卖骑手状态系统》
c++·ui·设计模式·状态模式
猿太极4 小时前
设计模式学习(3)-行为型模式
c++·设计模式
快乐非自愿6 小时前
常用设计模式:工厂方法模式
javascript·设计模式·工厂方法模式
guangzan12 小时前
常用设计模式:模板方法模式
设计模式
Lei_33596715 小时前
[設計模式]二十三種設計模式
设计模式
小毛驴85016 小时前
软件设计模式-适配器模式
电脑·适配器模式
吃饺子不吃馅17 小时前
面试官:JWT、Cookie、Session、Token有什么区别?
前端·设计模式·面试
leafff12318 小时前
一文读懂:如何选择适合的RAG系统架构设计模式?
设计模式·自然语言处理·系统架构
ZHE|张恒20 小时前
设计模式实战篇(一):彻底搞懂 Singleton 单例模式
单例模式·设计模式