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

C++中的适配器模式

适配器模式(Adapter Pattern)

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

实际应用

图形渲染库适配器

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

#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;
}
日志系统适配器

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

#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;
}
支付系统适配器

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

#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;
}

 

总结

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


http://www.kler.cn/a/398489.html

相关文章:

  • C++深度搜索(2)
  • MySQL中Flashback(闪回)技术
  • PETR/PETRv2/StreamPETR论文阅读
  • 【Oracle篇】掌握SQL Tuning Advisor优化工具:从工具使用到SQL优化的全方位指南(第六篇,总共七篇)
  • STM32设计防丢防摔智能行李箱
  • 狼蛛F87Pro键盘常用快捷键的使用说明
  • Prometheus面试内容整理-Prometheus 的架构和工作原理
  • 【第五课】Rust所有权系统(一)
  • React教程第二节之虚拟DOM与Diffing算法理解
  • 【网络】什么是路由器 (Router )网关设备(Gateway)?
  • 【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
  • 【java】链表:遍历一遍找到mid node
  • Spring Boot框架在电商领域的应用
  • 蓝队基础1 -- 企业信息架构与安全基础
  • 【SQL】mysql常用命令
  • 游戏引擎学习第16天
  • ArcGIS的汉字(亚洲文本)垂直标注
  • 使用Web Accessibility技术提升网站的可达性和用户体验
  • TableGPT2-7B:用于表格数据分析的大规模解码器模型
  • 如何从docker-hub下载镜像
  • 【priority_queue的使用及模拟实现】—— 我与C++的不解之缘(十六)
  • 题目讲解17 判断链表中是否有环
  • BigQuery中jobUser和dataViewer的角色有什么不同
  • C++ 内联函数
  • 006.精读《Apache Paimon Docs - Concepts》
  • ArkTs简单入门案例:简单的图片切换应用界面