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

C++中的适配器模式

目录

适配器模式(Adapter Pattern)

实际应用

图形渲染库适配器

日志系统适配器

支付系统适配器

总结


适配器模式(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;
}

总结

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

相关文章:

C++中的适配器模式

目录 适配器模式&#xff08;Adapter Pattern&#xff09; 实际应用 图形渲染库适配器 日志系统适配器 支付系统适配器 总结 适配器模式&#xff08;Adapter Pattern&#xff09; 适配器模式是一种结构型设计模式&#xff0c;它使得原本由于接口不兼容而不能一起工作的类…...

MySQL入门学习-聚合和分组.最大值(MAX()函数)

MAX() 函数用于返回表达式的最大值。它通常与聚合和分组一起使用&#xff0c;以计算分组中的最大值。 以下是一些常见的聚合和分组函数&#xff1a; 1. MAX()&#xff1a;返回表达式的最大值。 2. MIN()&#xff1a;返回表达式的最小值。 3. AVG()&#xff1a;返回表达式的…...

LLM大语言模型(十六):最新开源 GLM4-9B 本地部署,带不动,根本带不动

目录 前言 本机环境 GLM4代码库下载 模型文件下载&#xff1a;文件很大 修改为从本地模型文件启动 启动模型cli对话demo 慢&#xff0c;巨慢&#xff0c;一个字一个字的蹦 GPU资源使用情况 GLM3资源使用情况对比 前言 GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 …...

【JVM】JVM 的内存区域

Java虚拟机&#xff08;JVM&#xff09;在执行Java程序时&#xff0c;将其运行时数据划分到若干不同的内存区域。这些内存区域的管理对Java应用程序的性能和稳定性有着重要影响。JVM的内存区域主要包括以下几部分&#xff1a; 方法区&#xff08;Method Area&#xff09;&#…...

intel新CPU性能提升68%!却在内存上违反祖训

前几天的台北电脑展「Computex」&#xff0c;各家都拿出了看家本领。 老朋友 AMD 在会展上发布了最新的锐龙 9000 系列和自己家移动处理器 HX AI 系列&#xff0c;IPC 和能效都取得了不错的进步。 当然隔壁蓝厂 intel 也没闲着&#xff0c;当即就掏出了下一代的低功耗移动端处…...

stm32MP135裸机编程:修改官方GPIO例程在DDR中点亮第一颗LED灯

0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf 正点原子stm32mp135开发板&原理图 STM32Cube_FW_MP13_V1.1.0 STM32CubeIDE v1.151 需要修改那些地方 1.1 修改LED引脚 本例使用开发板的PI3引脚链接的LED作为我们点亮的第一颗LED灯&#xff0c;…...

探索乡村振兴新模式:发挥科技创新在乡村振兴中的引领作用,构建智慧农业体系,助力美丽乡村建设

随着科技的不断进步&#xff0c;乡村振兴工作正迎来前所未有的发展机遇。科技创新作为推动社会发展的重要力量&#xff0c;在乡村振兴中发挥着越来越重要的引领作用。本文旨在探讨如何发挥科技创新在乡村振兴中的引领作用&#xff0c;通过构建智慧农业体系&#xff0c;助力美丽…...

机器学习笔记:focal loss

1 介绍 Focal Loss 是一种在类别不平衡的情况下改善模型性能的损失函数最初在 2017 年的论文《Focal Loss for Dense Object Detection》中提出这种损失函数主要用于解决在有挑战性的对象检测任务中&#xff0c;易分类的负样本占据主导地位的问题&#xff0c;从而导致模型难以…...

Python编程:解锁超能力,开挂人生!

在当今数字化时代&#xff0c;编程技能变得日益重要&#xff0c;而Python作为一门功能强大且易于学习的编程语言&#xff0c;已经成为许多人的首选。掌握Python&#xff0c;确实可以让你在技术领域如鱼得水&#xff0c;仿佛拥有了超能力一般。 Python的简易语法和丰富的库资源…...

TSINGSEE青犀视频:城市道路积水智能监管,智慧城市的守护者

随着城市化进程的加快&#xff0c;城市道路网络日益复杂&#xff0c;尤其在夏季&#xff0c;由于暴雨频发&#xff0c;道路积水问题成为影响城市交通和市民生活的重要因素之一。传统的道路积水监测方式往往依赖于人工巡逻和简单的监控设备&#xff0c;这些方法存在效率低下、响…...

几款免费又好用的项目管理工具(甘特图)

选择甘特图工具时&#xff0c;我们不仅要考虑工具的基本功能&#xff0c;还要考虑其易用性、团队协作能力、定制性以及与其他软件的集成能力。以下是几款好用的甘特图工具及它们的优点和不足&#xff0c;帮助你来选择适合自己的工具&#xff1a; 1、进度猫 特点&#xff1a; 任…...

落地台灯什么牌子的比较好?五款适合学生使用的大路灯分享

以往只知道养孩子难&#xff0c;但到底有多难&#xff0c;心里确实没有个切实的预期&#xff0c;但随着我家孩子越长越大&#xff0c;我才知道原来想要把孩子的身心健康照顾好到底是有多难&#xff01;吃、穿、住、行无一不要精心挑选&#xff0c;就是为了能给他营造一个更好的…...

(免费领源码)基于 node.js#vue#mysql的网上游戏商城35112-计算机毕业设计项目选题推荐

摘 要 本论文主要论述了如何使用node.js语言开发一个基于vue的网上游戏商城&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;本系统采用的数据库是Mysql&#xff0c;使用node.js的koa技术技术构建的一个管理系统&#xff0c;实现了本系统的全部功能。在…...

[2024-06]-[大模型]-[Ollama] 0-相关命令

常用的ollama命令[持续更新中] ollama更新&#xff1a; curl https://ollama.ai/install.sh |sh带着flash attention启动&#xff1a; OLLAMA_FLASH_ATTENTION1 ollama serve停止ollama服务&#xff1a; sudo systemctl stop ollama note&#xff1a;目前遇到sudo systemctl …...

Image组件无法设置长按事件

最近对image 设置长按事件&#xff0c;通过api发现有个长按事件 LongPressGesture&#xff0c;但是使用了长按没反应&#xff0c;于是看文档&#xff0c;文档描述如下&#xff1a; 当组件默认支持可拖拽时&#xff0c;如Text、TextInput、TextArea、HyperLink、Image和RichEd…...

计算机网络 —— 数据链路层(VLAN)

计算机网络 —— 数据链路层&#xff08;VLAN&#xff09; 什么是VLAN为什么要有VLANVLAN如何实现IEEE 802.1Q 我们今天来看VLAN&#xff1a; 什么是VLAN VLAN&#xff08;Virtual Local Area Network&#xff0c;虚拟局域网&#xff09;是一种网络技术&#xff0c;它将一个物…...

Redis基本操作介绍

1. 安装与启动 安装&#xff1a;Redis支持多种操作系统&#xff0c;包括Linux、Windows等。从Redis官网下载相应的安装包&#xff0c;并按照系统要求进行安装。启动&#xff1a; Linux系统&#xff1a;在终端中&#xff0c;进入Redis的安装目录&#xff0c;运行redis-server命…...

Unity3d使用3D WebView for Windows and macOS打开全景网页(720云)操作问题记录

问题描述 使用Unity3d内嵌网页的形式打开720云中的全景图这个功能&#xff0c;使用的是3D WebView for Windows and macOS插件&#xff0c;720云的全景图在浏览器上的操作是滑动鼠标滚轮推远/拉近全景图&#xff0c;鼠标左键拖拽网页可以旋转全景图内容。网页的打开过程是正常…...

把文件从一台linux机器上传到另一台linux机器上

文章目录 1&#xff0c;第一种情况1.1 先测试2台机器是否可以互相通信1.2 对整个文件夹里面的所有内容进行传输的命令1.3 检查结果 2&#xff0c;第二种情况2.1&#xff0c;单个文件传输的命令 1&#xff0c;第一种情况 我这里有2台linux机器&#xff0c; 机器A&#xff1a;19…...

WT32-ETH01作为TCP Server进行通讯

目录 模块简介WT32-ETH01作为TCP Server设置W5500作为TCP Client设置连接并进行通讯总结 模块简介 WT32-ETH01网关主要功能特点: 采用双核Xtensa⑧32-bit LX6 MCU.集成SPI flash 32Mbit\ SRAM 520KB 支持TCP Server. TCP Client, UDP Server. UDP Client工作模式 支持串口、wi…...

mvn install -DskipTests

mvn install -DskipTests mvn install -DskipTests 不用做测试的打包代码...

Lua搭建网站后台教程

本文讲解如何使用二进制发布包和FastWeb网站管理工具搭建站点 FastWeb网站管理工具 使用该工具可快速在Windows平台部署。支持官方或三方模块的自动安装、日志调试、版本更新等。 1、下载最新版本压缩包 2、解压到任意目录(建议英文) 3、运行 ①点击 [设置]->[安装] 部…...

Java | Leetcode Java题解之第137题只出现一次的数字II

题目&#xff1a; 题解&#xff1a; class Solution {public int singleNumber(int[] nums) {int a 0, b 0;for (int num : nums) {b ~a & (b ^ num);a ~b & (a ^ num);}return b;} }...

大数据技术Hbase列数据库——topic3

目录 启动Hadoop启动HbaseHbase常用Shell命令基本命令关于表的操作增删改查询 启动Hadoop 1.到Hadoop安装目录下输入命令 sbin/start-all.sh[rootlocalhost hadoop-2.7.1]# sbin/start-all.sh This script is Deprecated. Instead use start-dfs.sh and start-yarn.sh Starti…...

Sklearn基础教程:机器学习界的瑞士军刀

Sklearn基础教程&#xff1a;机器学习界的瑞士军刀 引言 在机器学习的世界里&#xff0c;sklearn&#xff08;Scikit-learn&#xff09;就像是一把瑞士军刀&#xff0c;小巧、多功能&#xff0c;而且非常实用。无论你是数据科学家还是编程新手&#xff0c;sklearn都能成为你解…...

Python异步爬虫批量下载图片-协程

import aiofiles import aiohttp import asyncio import requests from lxml import etree from aiohttp import TCPConnectorclass Spider:def __init__(self, value):# 起始urlself.start_url value# 下载单个图片staticmethodasync def download_one(url):name url[0].spl…...

力扣 42. 接雨水

题目来源&#xff1a;https://leetcode.cn/problems/trapping-rain-water/description/ C题解1&#xff1a;双指针 按列算&#xff0c;一列一列的求雨水面积。使用双指针是记录当前列左右侧的最大元素。 class Solution { public:int trap(vector<int>& height) {in…...

Elastic Platform 8.14:ES|QL 正式发布、静态加密和向量搜索优化

作者&#xff1a;来自 Elastic Gilad Gal, Tyler Perkins, Alex Chalkias, Trevor Blackford, Ninoslav Miskovic, Fabio Busatto, Aris Papadopoulos Elastic Platform 8.14 提供了 Elasticsearch 查询语言 (ES|QL) 的正式发行版 (GA) — Elastic 中数据探索和操作的未来。它还…...

UE4获取动画序列资产的动画时长

谢谢”朝闻道“大佬的指点~...

win10怎么截图?电脑截图的3个方法分享

win10怎么截图&#xff1f;在Windows 10操作系统中&#xff0c;截图功能不仅强大而且极其便捷。无论用户需要快速捕捉整个屏幕的内容&#xff0c;还是精确截取屏幕上的特定区域&#xff0c;它都能迅速响应并满足需求。通过内置的截图工具和快捷键&#xff0c;我们可以轻松完成各…...

28网站怎么做代理/腾讯广点通

计算几何中长遇到的问题&#xff1a;判断特定点是否在平面多边形内部。向量叉积是一种方法&#xff0c;用于凸多边形。【优角&#xff1a;角度值大于180度小于360度。凸多边形&#xff1a;沿着多边形的一边做一条直线&#xff0c;如果剩下所有的部分都在直线的同侧&#xff0c;…...

wordpress301改不回来/不受限制的浏览器

本专栏总结王利涛《C语言嵌入式Linux高级编程》第二期课程 文章目录一、程序的编译、链接1&#xff09;编译过程2&#xff09;链接过程二、链接脚本1&#xff09;不同的代码段如何组装&#xff1f;2&#xff09;链接脚本示例3&#xff09;不同开发环境下的链接脚本4&#xff09…...

wordpress媒体库路径/长沙百度地图

首先声明本人正在21世纪的风口浪尖---学生物的&#xff0c;属于第一次从github上搬运项目&#xff0c;而且第一次就搬运了这么大的项目&#xff0c;所以其中碰到了些只有咱们这种小白可能会遇到的坑。这个faster-rcnn的版本来自于&#xff1a;ruotianluo/pytorch-faster-rcnn​…...

苏州企业做网站/青岛网站排名提升

学习时&#xff0c;为了搜集最全的中文资料&#xff0c;有时候不得不使用Baidu搜索引擎。在你还是个小菜鸡的时候你可能会花费大量时间在百度上&#xff01; 但是&#xff0c;时间久了你会发现&#xff0c;你总会被网络上一些奇奇怪怪或者有趣的事情吸引过去而逐渐忘记自己曾经…...

做调查问卷赚钱的网站/关键词优化排名网站

亲测可用&#xff0c;若有疑问请私信 一、设置导航栏颜色 在url后面拼接dd_nav_bgcolor参数即可&#xff0c;如下&#xff1a; 支持的格式:“AARRGGBB” http://abc.xyz?dd_nav_bgcolorFF5E97F6 二、微应用页面支持横屏 在url后面拼接dd_orientation参数即可&#xff0c;如…...

dz论坛做视频网站教程/目前搜索引擎排名

亲爱的忍忍:为了给忍忍们带来更好的游戏体验&#xff0c;《忍者必须死3》预计于2021年3月25日2:00-10:00进行停服维护(根据具体情况提前或推迟开放)。请各位忍忍相互转告&#xff0c;并合理安排游戏时间&#xff0c;以免造成损失。【维护时间】2021年3月25日2:00-10:00【更新内…...