设计模式——适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目的是将一个接口转换成客户希望的另一个接口。它使原本由于接口不兼容而不能一起工作的类能够协同工作。

原理

适配器模式的核心原理是"封装",它包含以下角色:

  • 目标接口(Target Interface): 定义客户端期望的接口。
  • 被适配者(Adaptee Class): 已存在的需要被适配的接口或类。
  • 适配器(Adapter Class): 实现目标接口,并持有被适配者的实例,负责在内部进行转换逻辑,使得目标接口和被适配者可以协同工作。

适配器通常有以下两种实现方式:

  • 类适配器:通过继承被适配者并实现目标接口来达到适配的目的。
  • 对象适配器:通过组合的方式持有被适配者的实例,并实现目标接口,通过调用被适配者的方法来完成适配。

Java代码示例 - 对象适配器

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

// 被适配者类
public class Adaptee {
    public void specificRequest() {
        System.out.println("执行特定的操作...");
    }
}

// 适配器类
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 oldApi = new Adaptee();

        // 创建适配器,并传入被适配者对象
        Target adapter = new Adapter(oldApi);

        // 客户端代码只需要与目标接口交互
        adapter.request(); // 输出 "执行特定的操作..."
    }
}

想象你有一个老式的Walkman播放器,但是你想用它来连接到你的新式蓝牙音箱上听音乐。适配器就像是一个转换插头,它的一端可以插入Walkman的耳机插孔,另一端则符合蓝牙音箱的充电口标准。这样,尽管两者接口不同,但通过适配器就能让他们互相配合工作了。

应用场景

  • 遗留系统集成:当需要使用一些遗留库或者第三方API时,如果其接口不符合当前系统的规范,可以通过适配器模式对其进行包装。
  • 多态性设计:在一个系统中,需要把多种不同接口的对象统一起来处理,可以为每种对象创建一个适配器类,从而让它们都满足通用接口的要求。
  • 数据格式转换:如将XML数据转换为JSON数据,或者将不同数据库驱动的查询结果转换为统一的数据模型。

适用性

  • 当需要使用现有的类,而它的接口不符合需求时。
  • 想要创建可复用的类,该类可以与其他不相关的类或不可预见的类协同工作(即对这些类进行抽象化)。
  • 需要在多个具有相同接口的类中使用某个类,但是想在运行时决定具体使用哪个类。
相关推荐
承渊政道1 小时前
飞算Java炫技赛:Java×Unity数字孪生园区平台的从零落地记录
java·开发语言·unity·技术分享·vibe coding·飞算javaai·飞算java ai炫技赛
wdfk_prog7 小时前
嵌入式面试真题第 10 题:高优化等级下共享状态可见性、内存模型与系统级同步设计
java·linux·开发语言·面试·职场和发展·架构·c
卓怡学长7 小时前
w255基于springboot仓库管理系统
java·数据库·spring boot·spring·intellij-idea
这个DBA有点耶10 小时前
SQL调优进阶:从“优化一条SQL”到“优化一个系统”的思维升级
java·大数据·数据库·sql·程序人生·dba·改行学it
csdn2015_10 小时前
springboot读取配置的方法
java·spring boot·spring
AOwhisky11 小时前
下一代容器来了?Docker 宣布原生支持 WebAssembly
java·运维·docker·容器·rust·wasm
云云只是个程序马喽13 小时前
海外短剧平台搭建方案:私有化源码系统选型|云微短剧系统技术架构拆解
java·php
C137的本贾尼14 小时前
第七篇:消息队列(MQ)——就是个带存储的异步通信管道
java·开发语言·中间件
Flittly14 小时前
【AgentScope Java新手村系列】(19)多模态-图像音频视频
java·spring boot·spring
Javatutouhouduan14 小时前
国内大厂Java面试高频题库(2026突击版)
java·架构师·java面试·java面试题·后端开发·java程序员·java八股文