适配器模式,C++ 实践讲解

一、示例场景

在日常开发里,经常会遇到这么一个尴尬场景:

你要用的库早就存在了,而且功能挺好用,但它的接口风格和你项目里约定的完全不一样。

这时候怎么办?直接在业务代码里写一堆兼容代码?以后换库的时候全项目大面积改动?

------这就是典型的"接口不对路"的问题。

适配器模式(Adapter)就是专门解决这个问题的,它的作用就一句话:

把"不兼容"的接口用一个中间层翻译一下,让它能无缝接入到现有系统。

假设我们有一个老的日志库 OldLogger,只能用 logMessage(std::string) 来写日志。

但在项目中,我们已经约定使用统一接口 ILogger,提供 info()error() 方法。

我们不希望在业务里到处写 logMessage("[INFO] ..."),所以需要用适配器来包装。

二、类图

三、代码实现

通过 LoggerAdapter 把旧的 OldLogger 包装成统一的 ILogger 接口,让客户端代码可以直接用 info()error() 方法,而不用关心底层的老接口。

cpp 复制代码
#include <iostream>
#include <string>

// 目标接口(Target)
struct ILogger {
    virtual ~ILogger() = default;
    virtual void info(const std::string& msg) = 0;
    virtual void error(const std::string& msg) = 0;
};

// 遗留类(Adaptee)
class OldLogger {
public:
    void logMessage(const std::string& text) {
        std::cout << "[OldLogger] " << text << std::endl;
    }
};

// 适配器(Adapter)
class LoggerAdapter : public ILogger {
public:
    LoggerAdapter(OldLogger& old) : oldLogger_(old) {}

    void info(const std::string& msg) override {
        oldLogger_.logMessage("[INFO] " + msg);
    }

    void error(const std::string& msg) override {
        oldLogger_.logMessage("[ERROR] " + msg);
    }

private:
    OldLogger& oldLogger_;
};

// 客户端(Client)
int main() {
    OldLogger legacy;
    LoggerAdapter logger(legacy);

    logger.info("system started");
    logger.error("something went wrong");

    return 0;
}

输出结果

cpp 复制代码
[OldLogger] [INFO] system started
[OldLogger] [ERROR] something went wrong

四、使用体会

适配器模式在代码里看上去并不复杂,就是多写一个类包一层。

但它的价值不在代码量,而在解耦:

  • 业务代码只依赖统一的接口,不和遗留库绑死;

  • 将来如果换成别的日志库,只要改适配器实现,业务完全不用动;

  • 旧接口和新接口的差异,都集中在适配器里消化掉了。

这也是我喜欢的一点:适配器就是专门处理"接口不统一"这个麻烦的。

五、总结

适配器模式本质上就是"旧瓶装新酒":

  • 瓶子是新接口(ILogger),

  • 酒是旧实现(OldLogger),

  • 适配器就是把酒灌进新瓶子的过程。

下次遇到类似场景时,不妨先想一想是不是可以写个 Adapter,把问题收敛到一个地方去处理。这样以后维护起来,心态会轻松很多。

相关推荐
草莓熊Lotso4 小时前
基于容器适配器模式的 Stack 与 Queue 实现:复用底层容器的优雅设计
c++·网络协议·rpc·适配器模式
Query*3 天前
Java 设计模式——适配器模式进阶:原理深挖、框架应用与实战扩展
java·设计模式·适配器模式
Query*3 天前
Java 设计模式——适配器模式:从原理到3种实战的完整指南
java·设计模式·适配器模式
Deschen8 天前
设计模式-适配器模式
java·设计模式·适配器模式
王嘉俊92510 天前
设计模式--适配器模式:优雅解决接口不兼容问题
java·设计模式·适配器模式
笨手笨脚の15 天前
设计模式-适配器模式
设计模式·适配器模式·结构型设计模式
青草地溪水旁15 天前
第六章:适配器模式 - 接口转换的艺术大师
c++·适配器模式
YA33317 天前
java设计模式五、适配器模式
java·设计模式·适配器模式
Mr_WangAndy21 天前
C++设计模式_结构型模式_适配器模式Adapter
c++·设计模式·适配器模式·c++设计模式
1710orange21 天前
java设计模式:适配器模式
java·设计模式·适配器模式