当前位置: 首页 > news >正文

设计模式-适配器模式

适配器模式是一种结构型设计模式,用于将一个类的接口转换为客户端期望的另一个接口,使得原本不兼容的类可以协同工作。它的核心思想是通过中间层(适配器)解决接口不匹配的问题,类似于电源插头转换器。

核心思想

适配器模式通过以下方式实现接口的兼容:

  1. 定义目标接口(Target):客户端期望使用的接口。
  2. 引入适配者类(Adaptee):需要被适配的现有类(接口不兼容)。
  3. 创建适配器类(Adapter):将适配者的接口转换为目标接口。

适配器模式分为两种实现方式:

  • 类适配器:通过继承适配者类实现目标接口(需要支持多继承,Java中不适用)。
  • 对象适配器:通过组合(持有适配者的实例)实现目标接口(更灵活,推荐使用)。

适配器模式的结构

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

  • 目标接口(Target)
    • 客户端期望使用的接口。
    • 定义客户端需要的方法。
  • 适配者类(Adaptee)
    • 需要被适配的现有类(接口与目标接口不兼容)。
  • 适配器类(Adapter)
    • 实现目标接口,并持有适配者的实例。
    • 在目标接口方法中调用适配者的方法,完成接口转换。

实现示例

假设有一个欧洲标准的插座(220V),而客户端需要一个美国标准的插座(110V)。通过适配器模式实现电压转换。
(1)目标接口(Target)

// 客户端期望的接口:美国标准插座(110V)
public interface USPlug {
    void supplyPower110V();
}

(2)适配者类(Adaptee)

// 现有的欧洲标准插座(220V)
public class EUPlug {
    public void supplyPower220V() {
        System.out.println("提供220V电压");
    }
}

(3)适配器类(Adapter)

// 适配器:将欧洲插座转换为美国标准
public class EUToUSAdapter implements USPlug {
    private EUPlug euPlug; // 持有适配者的实例

    public EUToUSAdapter(EUPlug euPlug) {
        this.euPlug = euPlug;
    }

    @Override
    public void supplyPower110V() {
        euPlug.supplyPower220V();
        System.out.println("通过适配器将220V转换为110V");
    }
}

(4)客户端代码(Client)

public class Client {
    public static void main(String[] args) {
        // 现有的欧洲插座
        EUPlug euPlug = new EUPlug();

        // 创建适配器,将欧洲插座转换为美国标准
        USPlug usPlug = new EUToUSAdapter(euPlug);

        // 客户端使用适配后的接口
        usPlug.supplyPower110V();
    }
}

输出结果:

提供220V电压
通过适配器将220V转换为110V

适配器模式的优点

  1. 接口兼容
    使原本不兼容的类可以协同工作。

  2. 复用现有代码
    无需修改适配者的代码,直接通过适配器复用功能。

  3. 灵活扩展
    可以适配多个不同的类,甚至结合其他模式(如工厂模式)动态选择适配器。

适配器模式的缺点

  1. 增加复杂性
    引入适配器类会增加代码层级,可能使系统变得复杂。

  2. 性能开销
    额外的适配器调用可能带来轻微的性能损耗(通常可忽略)。

类适配器 vs 对象适配器

类适配器(Java中不可用,需多继承)

public class Adapter extends Adaptee implements Target {
    @Override
    public void targetMethod() {
        super.adapteeMethod();
    }
}

对象适配器(推荐使用)

public class Adapter implements Target {
    private Adaptee adaptee;
    
    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    @Override
    public void targetMethod() {
        adaptee.adapteeMethod();
    }
}

适配器模式的实际应用

  • Java中的InputStreamReader和OutputStreamWriter
    将字节流(InputStream/OutputStream)适配为字符流(Reader/Writer)。

    Reader reader = new InputStreamReader(new FileInputStream("file.txt"), "UTF-8");
    
  • Spring框架中的HandlerAdapter
    在Spring MVC中,HandlerAdapter将不同类型的处理器(如Servlet、Controller)适配为统一的处理接口。

  • Android中的RecyclerView.Adapter
    将数据集合适配为RecyclerView可显示的视图项。

应用场景

  1. 系统升级或整合
    旧系统与新系统接口不兼容时,通过适配器过渡。

  2. 第三方库适配
    使用第三方库时,接口与现有代码不匹配。

  3. 统一多个类的接口
    需要将多个不同接口的类统一为同一接口供客户端使用。

总结

适配器模式是解决接口不兼容问题的利器,通过中间层(适配器)实现接口转换。它在系统升级、整合第三方库等场景中广泛应用,是提升代码复用性和灵活性的重要手段。

相关文章:

  • 【网页】自制流光卡片
  • 【面试手撕】非常规算法,多线程常见手撕题目
  • 【开源免费】基于SpringBoot+Vue.JS智慧生活商城系统(JAVA毕业设计)
  • vue/H5的日历组件可简单定制
  • 【spring boot 实现图片验证码 前后端】
  • STM32微控制器_03_GPIO原理与应用
  • 力扣No.376.摆动序列
  • LightGBM + TA-Lib A股实战进阶:Optuna调优与Plotly可视化详解
  • 【pptx-preview】react+pptx预览
  • 蓝牙系统的核心组成解析
  • 拥抱健康养生,开启活力生活
  • {瞎掰} 手机安装app问题:app签名,手机 or OS官方商店 其他非官方app源,安全防护 突破限制
  • gitee 远程修改完密码本地提交出错的解决方案
  • 网络性能指标
  • TK矩阵系统的软件服务
  • tuh_eeg数据集
  • 文档搜索引擎项目测试
  • 国密系列加密技术及其在爬虫逆向中的应用研究
  • linux按照nginx
  • Day 18:数字 1 的个数
  • 青海规范旅游包车行为:不得引导外省籍旅游包车违规驻地运营
  • 人民币对美元即期汇率盘中创半年新高,离岸市场升破7.2
  • 世贸组织欢迎中美经贸高层会谈取得积极成果
  • 巫蛊:文化的历史暗流
  • 种罂粟喂鸡防病?四川广元一村民非法种植毒品原植物被罚​
  • 王毅同巴基斯坦副总理兼外长达尔通电话