适配器模式

 适配器模式(Adapter Pattern)是一种设计模式,它就像我们日常用的电源插头转换器:如果你有一个圆孔的插座(目标接口),但手头是扁插头的电器(现有类),那么需要一个转换器(适配器)把扁插头转成圆插头,让电器能正常通电。

 在代码中,适配器模式的作用是让两个接口不兼容的类能够一起工作。它通过创建一个中间类(适配器),将现有类的接口转换成客户端期望的另一个接口。

适配器模式角色如下:

  • Target:目标接口 (可以是抽象类或接口), 客户希望直接用的接口
  • Adaptee:适配者,但是与Target不兼容
  • Adapter:适配器类, 此模式的核心,通过继承或者引⽤适配者的对象,把适配者转为目标接口
  • client:需要使⽤适配器的对象

 有下面的代码,目标接口为Slf4jApi,这是客户端(Slf4jDemo)希望使用的日志接口,它有一个 log 方法

java 复制代码
interface Slf4jApi {
    void log(String message);
}

 这是一个现有的日志类,但它提供的日志方法名叫 log4jLog,与目标接口的 log 不匹配

java 复制代码
class Log4j {
    void log4jLog(String message) {
        System.out.println("Log4j打印:" + message);
    }
}

 此时设置适配器 Slf4jLog4JAdapter,它实现了目标接口 Slf4jApi,所以客户端可以把它当作 Slf4jApi 来使用。Log4j 对象通过构造函数的方式传入,

java 复制代码
class Slf4jLog4JAdapter implements Slf4jApi {
    private Log4j log4j;

    public Slf4jLog4JAdapter(Log4j log4j) {
        this.log4j = log4j;
    }

    @Override
    public void log(String message) {
        log4j.log4jLog(message);   // 把调用转发给适配者
    }
}

 客户端的代码如下,当客户端调用适配器的 log 方法时,适配器会调用内部 log4j 对象的 log4jLog 方法,完成从 log 到 log4jLog 的转换

java 复制代码
public class Slf4jDemo {
    public static void main(String[] args) {
        Slf4jApi slf4jApi = new Slf4jLog4JAdapter(new Log4j());
        slf4jApi.log("使用slf4j打印日志");
    }
}
相关推荐
xiaoye-duck17 小时前
《C++ 工具库实战》GTest 单元测试:断言、全局环境、局部夹具与底层原理
c++·单元测试·第三方库
Eyfcom21 小时前
〖物流系统架构演进实录 02〗物流网关设计:多平台接入适配与异构接口的统一收敛
适配器模式·物流管理系统·物流架构·网关设计·多平台对接
小凯在掘金2 天前
测试规范:为什么优先用 data-testid,而不是 CSS 选择器?
单元测试·测试
2501_915106322 天前
iOS 单元测试怎么跑?用 KXApp 在 VS Code 里跑 XCTest 和 Swift Testing
ide·vscode·ios·单元测试·个人开发·swift·敏捷流程
小莫4615 天前
把「测试有效性」加进 CI:GitHub Actions 配置指南
单元测试
全栈技术负责人5 天前
AI 自动化单元测试技术方案
运维·单元测试·自动化
川石课堂软件测试8 天前
涨薪技术|0到1学会性能测试第9课-HTTP响应统计
数据库·功能测试·网络协议·http·kubernetes·单元测试·测试用例
我命由我123459 天前
SQL 检测脚本
java·数据库·sql·功能测试·单元测试·压力测试·可用性测试
yuehuaxin0111 天前
LS8011C 快充协议芯片|SOT‑23‑6L 内置 431,PD3.2 SPR/PPS 适配器物料备选评估调试笔记
笔记·智能家居·适配器模式·智能硬件
yuehuaxin0111 天前
LP3717BSL 芯茂微|SOP8L 自供电 PSR,SEL 电阻调峰值电流,12W 充电器物料替代评估笔记
嵌入式硬件·适配器模式·智能硬件