C++中的适配器模式

目录

[适配器模式(Adapter Pattern)](#适配器模式(Adapter Pattern))

实际应用

图形渲染库适配器

日志系统适配器

支付系统适配器

总结


适配器模式(Adapter Pattern)

适配器模式是一种结构型设计模式,它使得原本由于接口不兼容而不能一起工作的类可以协同工作。适配器模式通过将一个类的接口转换成客户端希望的另一种接口,使得原本接口不兼容的类可以一起工作。适配器可以是对象适配器或类适配器,对象适配器使用组合,类适配器使用多重继承。

实际应用

图形渲染库适配器

假设我们有一个旧的图形渲染库和一个新的图形渲染接口,我们需要使旧的库适配新的接口。

cpp 复制代码
#include <iostream>

// 旧的图形渲染库
class OldGraphicsRenderer {
public:
    void drawCircle(float x, float y, float radius) {
        std::cout << "Old Renderer: Drawing Circle at (" << x << ", " << y << ") with radius " << radius << "\n";
    }

    void drawRectangle(float x, float y, float width, float height) {
        std::cout << "Old Renderer: Drawing Rectangle at (" << x << ", " << y << ") with width " << width << " and height " << height << "\n";
    }
};

// 新的图形渲染接口
class NewGraphicsRenderer {
public:
    virtual void renderCircle(float x, float y, float radius) = 0;
    virtual void renderRectangle(float x, float y, float width, float height) = 0;
};

// 适配器类,将旧的渲染库适配到新的接口
class GraphicsRendererAdapter : public NewGraphicsRenderer {
private:
    OldGraphicsRenderer* oldRenderer;
public:
    GraphicsRendererAdapter(OldGraphicsRenderer* renderer) : oldRenderer(renderer) {}

    void renderCircle(float x, float y, float radius) override {
        oldRenderer->drawCircle(x, y, radius);
    }

    void renderRectangle(float x, float y, float width, float height) override {
        oldRenderer->drawRectangle(x, y, width, height);
    }
};

int main() {
    OldGraphicsRenderer oldRenderer;
    GraphicsRendererAdapter adapter(&oldRenderer);

    adapter.renderCircle(10, 10, 5);
    adapter.renderRectangle(20, 20, 10, 5);

    return 0;
}

日志系统适配器

假设我们有一个旧的日志系统和一个新的日志系统接口,我们需要使旧的日志系统适配新的接口。

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

// 旧的日志系统
class OldLogger {
public:
    void logMessage(const std::string& msg) {
        std::cout << "Old Logger: " << msg << "\n";
    }
};

// 新的日志系统接口
class NewLogger {
public:
    virtual void info(const std::string& msg) = 0;
    virtual void error(const std::string& msg) = 0;
};

// 适配器类,将旧的日志系统适配到新的接口
class LoggerAdapter : public NewLogger {
private:
    OldLogger* oldLogger;
public:
    LoggerAdapter(OldLogger* logger) : oldLogger(logger) {}

    void info(const std::string& msg) override {
        oldLogger->logMessage("INFO: " + msg);
    }

    void error(const std::string& msg) override {
        oldLogger->logMessage("ERROR: " + msg);
    }
};

int main() {
    OldLogger oldLogger;
    LoggerAdapter adapter(&oldLogger);

    adapter.info("This is an info message");
    adapter.error("This is an error message");

    return 0;
}

支付系统适配器

假设我们有一个旧的支付系统和一个新的支付接口,我们需要使旧的支付系统适配新的接口。

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

// 旧的支付系统
class OldPaymentSystem {
public:
    void makePayment(double amount, const std::string& currency) {
        std::cout << "Old Payment System: Processing payment of " << amount << " " << currency << "\n";
    }
};

// 新的支付接口
class NewPaymentInterface {
public:
    virtual void pay(double amount) = 0;
};

// 适配器类,将旧的支付系统适配到新的接口
class PaymentAdapter : public NewPaymentInterface {
private:
    OldPaymentSystem* oldPaymentSystem;
public:
    PaymentAdapter(OldPaymentSystem* paymentSystem) : oldPaymentSystem(paymentSystem) {}

    void pay(double amount) override {
        oldPaymentSystem->makePayment(amount, "USD");
    }
};

int main() {
    OldPaymentSystem oldPaymentSystem;
    PaymentAdapter adapter(&oldPaymentSystem);

    adapter.pay(100.0);

    return 0;
}

总结

适配器类通过包含或继承旧系统类,并实现新接口的方法,从而将旧系统的方法适配到新接口上。

相关推荐
掘根1 天前
【消息队列项目】客户端四大模块实现
开发语言·后端·ruby
-To be number.wan1 天前
C++ 赋值运算符重载:深拷贝 vs 浅拷贝的生死线!
前端·c++
疯狂的挖掘机1 天前
记一次基于QT的图片操作处理优化思路(包括在图上放大缩小,截图,画线,取值等)
开发语言·数据库·qt
cnxy1881 天前
围棋对弈Python程序开发完整指南:步骤4 - 提子逻辑和劫争规则实现
开发语言·python·机器学习
意趣新1 天前
C 语言源文件从编写完成到最终生成可执行文件的完整、详细过程
c语言·开发语言
李艺为1 天前
根据apk包名动态修改Android品牌与型号
android·开发语言
XXYBMOOO1 天前
内核驱动开发与用户级驱动开发:深度对比与应用场景解析
linux·c++·驱动开发·嵌入式硬件·fpga开发·硬件工程
黄河滴滴1 天前
java系统变卡变慢的原因是什么?从oom的角度分析
java·开发语言
老华带你飞1 天前
农产品销售管理|基于java + vue农产品销售管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
superman超哥1 天前
Rust Workspace 多项目管理:单体仓库的优雅组织
开发语言·rust·多项目管理·rust workspace·单体仓库