13.适配器模式

文章目录


适配器模式

介绍

适配器模式是一种结构型设计模式,主要用于将一个类的接口转换成客户端期望的另一个接口。这样,原本由于接口不匹配而无法一起工作的类可以通过适配器一起工作。

组成

  1. 目标接口(Target Interface): 客户端所期望的接口,适配器通过实现或者继承这个接口,使得适配器对象可以被客户端调用。
  2. 适配器(Adapter): 将被适配者的接口转换成目标接口,使得被适配者可以被客户端使用。
  3. 被适配者(Adaptee): 需要被适配的接口或类,这是客户端现有的类,但其接口与目标接口不匹配。

结构图

场景

假设我们原有系统使用了一个名为LegacyLogger的日志记录类,现在,我们引入了一个新的日志记录框架,我们希望在不修改现有系统代码的情况下,将新的日志记录框架整合到原有系统中,这时可以使用适配器模式。

代码

java 复制代码
//原有的日志记录类
public class LegacyLogger {
    public void log(String message) {
        System.out.println("Legacy Logging: " + message);
    }
}
java 复制代码
//新的日志记录框架
public interface NewLogger {
    void logInfo(String message);
    void logError(String message);
}
java 复制代码
//适配器接口
public interface LegacyLoggerAdapter extends NewLogger {

    // 可以添加一些额外的方法或进行适配
    // void logDebug(String message);
}
java 复制代码
//适配器实现
public class LegacyLoggerAdapterImpl implements LegacyLoggerAdapter {

    private LegacyLogger legacyLogger;

    public LegacyLoggerAdapterImpl(LegacyLogger legacyLogger) {
        this.legacyLogger = legacyLogger;
    }

    @Override
    public void logInfo(String message) {
        // 将新日志框架的info级别映射为旧日志框架的log方法
        legacyLogger.log(message);
    }

    @Override
    public void logError(String message) {
        // 将新日志框架的error级别映射为旧日志框架的log方法
        legacyLogger.log(message);
    }
}
java 复制代码
public class Client {

    public static void main(String[] args) {
        // 原有系统使用LegacyLogger
        LegacyLogger legacyLogger = new LegacyLogger();
        legacyLogger.log("Legacy log message");

        // 引入新日志框架,使用适配器整合到原有系统中
        NewLogger newLogger = new LegacyLoggerAdapterImpl(legacyLogger);
        newLogger.logInfo("New log message: info");
        newLogger.logError("New log message: error");
    }
}

在这个例子中,LegacyLoggerAdapter是适配器接口,LegacyLoggerAdapterImpl是适配器的具体实现,它实现了NewLogger接口,内部使用LegacyLogger来实现新的日志框架接口。客户端代码可以通过NewLogger接口来调用新的日志框架,同时保留了原有系统对LegacyLogger的调用,实现了平滑过渡。这样就不需要修改原有系统代码,而能够整合新的功能。


总结

优点

  1. 兼容性: 适配器模式可以解决新旧系统、接口或类之间的兼容性问题,使它们能够协同工作,无需修改原有代码。
  2. 复用性: 适配器模式使得已有的类和接口能够被复用,无需修改其代码。这样可以减少重复编码,提高代码的复用性。
  3. 解耦性: 适配器模式可以解耦不同系统之间的依赖关系。原有系统不需要关心新系统的实现细节,只需通过适配器进行调用。
  4. 平滑过渡: 在系统升级、迁移或接口变更时,适配器模式可以作为过渡的一种方式,使得系统能够平滑过渡,逐步引入新的功能或接口。

总的来说,适配器模式适用于系统升级、整合或引入新功能时,希望保留原有系统的情况。通过适配器,可以使得新旧系统能够平滑地协同工作,提高系统的可维护性和灵活性。

相关推荐
sxlishaobin26 分钟前
Maven Setting详解
java·学习·maven
知守观32 分钟前
一个方法两个触发口:反编译 XXL-Job 后,我看清了 inner/job 子包的裸奔现状
java·spring boot·微服务
用户31268748772032 分钟前
CompletableFuture 链式编排:异步编程的优雅解法
java
瑞雪兆丰年兮1 小时前
JavaWeb-day14-SpringBootWeb原理篇
java·开发语言·spring boot·spring·bean·mybatis·javaweb
神仙别闹1 小时前
基于 Java GUI 贪心策略直接搜索算法和极大极小博弈树算法的智能人机博弈五子棋游戏
java·毕业设计·gui·贪心策略·极大极小博弈树
Flynn Liang2 小时前
RAG 评估体系:黄金集、检索指标与 LLM-as-Judge 落地
java·langchain·rag·评估·langchain4j·检索指标
杯子不吃紫菜2 小时前
LangGraph 体系实战(下):中断恢复、流式、子图与设计模式
单片机·嵌入式硬件·设计模式
SomeOtherTime2 小时前
Rust生命周期介绍(AI回答)
开发语言·后端·rust
程序猿打工仔2 小时前
计算机基础(C语言)考编、专技岗
c语言·开发语言·算法
喵本喵叁肆3 小时前
Rényi 差分隐私:把隐私损失看成一族矩(英文原题:Rényi Differential Privacy (CSF 2017))
开发语言·r语言