设计模式- 适配器模式(Adapter Pattern)结构|原理|优缺点|场景|示例

​​​​​​​ 设计模式(分类) 设计模式(六大原则)

创建型(5种) 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式

结构型(7种) 适配器模式 装饰器模式 代理模式 ​​​​​​外观模式 桥接模式 组合模式 享元模式

行为型(11种) 策略模式 模板方法模式 观察者模式 迭代器模式 责任链模式 命令模式

备忘录模式 状态模式 访问者模式 中介者模式


适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个接口转换为客户期望的另一个接口,从而使原本不兼容的类能够协同工作。适配器模式的主要目的是解决接口不匹配的问题,它通过创建一个适配器类,将源接口转换为目标接口,使得原本无法直接交互的类能够通过适配器进行通信。

模式结构

适配器模式通常包含以下角色:

  1. 目标接口(Target):定义客户端期望的接口,可以是一个接口或抽象类。目标接口是客户程序需要使用的接口。

  2. 源接口(Adaptee):需要被适配的接口,通常是第三方提供的接口或者遗留系统中的接口。

  3. 适配器(Adapter):适配器类实现了目标接口,并持有源接口的一个实例。适配器类通过将源接口的方法映射到目标接口的方法,使得客户端可以像使用目标接口一样使用源接口。

工作原理

  • 客户端:调用适配器对象的目标接口方法,与源接口无关。
  • 适配器:实现目标接口,内部持有源接口对象的引用。适配器在实现目标接口方法时,调用源接口对象的相关方法,将源接口的接口转换为客户端期望的目标接口。

适配器模式的两种形式

  1. 类适配器:适配器类通过继承源接口(Adaptee)并实现目标接口(Target)来实现适配。这种方式要求源接口必须是具体类,且目标接口和源接口之间要有一定的继承关系或共同父类。

  2. 对象适配器:适配器类通过组合(持有源接口对象的引用)而非继承来实现适配。适配器类实现目标接口,并在其方法中调用源接口对象的方法。这种方式更灵活,不要求源接口必须是具体类,也不要求源接口与目标接口之间有继承关系。

优缺点

优点
  • 复用现存类:适配器模式允许在不修改现有代码的情况下,将一个类的接口转换为另一个接口,使得现有类可以被复用。
  • 兼容性:通过适配器模式,可以使原本不兼容的接口之间能够协同工作,提高了系统的兼容性。
  • 灵活性:对象适配器模式可以将一个接口转换成多个接口,而类适配器模式由于Java的单继承限制,只能一对一地适配。
缺点
  • 过多的适配器:如果系统中存在大量的适配器类,可能会增加系统的复杂性,不易管理。
  • 过多的类:在使用类适配器时,可能会增加类的数量,特别是当系统中存在大量需要适配的类时。

适用场景

  • 需要使用一个已经存在的类,但它的接口不符合需求:可以通过适配器模式创建一个适配器类,将已有类的接口转换为期望的接口。
  • 想要创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作:适配器模式可以将目标接口与源接口解耦,使得适配器类可以适应更多的源接口。
  • 需要使用几个具有类似功能但接口不兼容的类:通过适配器模式可以创建统一的接口,简化客户端代码。

代码示例(以Java为例,展示对象适配器)

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

// 源接口(被适配的接口)
public class Adaptee {
    public void specificRequest() {
        System.out.println("Adaptee-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();  // 输出:Adaptee-specific request
    }
}

在这个Java示例中:

  • Target接口代表客户端期望的接口。
  • Adaptee类是需要被适配的源接口。
  • Adapter类实现了Target接口,并持有一个Adaptee对象的引用。在request()方法中,调用了adaptee.specificRequest(),实现了接口的适配。
  • 客户端代码创建Adaptee对象,然后通过Adapter将其包装成Target接口,并调用request()方法,实现了源接口与目标接口之间的转换。

代码示例(以Python为例)

python 复制代码
# 目标接口
class Target:
    def request(self):
        raise NotImplementedError("Subclasses must implement this method")

# 源接口(被适配的接口)
class Adaptee:
    def specific_request(self):
        print("Adaptee-specific request")

# 适配器类
class Adapter(Target):
    def __init__(self, adaptee: Adaptee):
        self._adaptee = adaptee

    def request(self):
        self._adaptee.specific_request()

# 客户端代码
def main():
    adaptee = Adaptee()
    adapter = Adapter(adaptee)
    adapter.request()  # 输出:Adaptee-specific request

if __name__ == "__main__":
    main()

在这个Python示例中:

  • Target类作为目标接口,定义了request()方法,要求子类必须实现。
  • Adaptee类是需要被适配的源接口,提供了specific_request()方法。
  • Adapter类继承自Target,实现了request()方法。在该方法中,调用了_adaptee.specific_request(),将源接口的方法映射到目标接口的方法上,实现了接口的适配。
  • 客户端代码创建Adaptee对象,然后通过Adapter将其包装成Target接口,并调用request()方法,实现了源接口与目标接口之间的转换。
相关推荐
ok!ko1 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
2402_857589361 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰2 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
拉里小猪的迷弟2 小时前
设计模式-创建型-常用:单例模式、工厂模式、建造者模式
单例模式·设计模式·建造者模式·工厂模式
哎呦没3 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
编程、小哥哥3 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
IT学长编程4 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统
莹雨潇潇4 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
严文文-Chris4 小时前
【设计模式-中介者模式】
设计模式·中介者模式
刷帅耍帅4 小时前
设计模式-中介者模式
设计模式·中介者模式