C++如何实现一个适配器(Adapter)设计模式?(代码示例)
发布时间 - 2025-12-25 00:00:00 点击率:次适配器模式通过转换接口使不兼容类协同工作,C++中推荐对象适配器;目标接口IDrawer定义drawCircle,Adaptee LegacyShapeRenderer提供renderCircleAt。
适配器模式用于让两个接口不兼容的类能够协同工作,核心是“转换接口”。C++ 中常用类适配器(继承)或对象适配器(组合)实现,推荐对象适配器——更灵活、符合合成复用原则。
定义目标接口(Target)
这是客户端期望使用的统一接口。例如,一个绘图系统只认 IDrawer:
class IDrawer {
public:
virtual ~IDrawer() = default;
virtual void drawCircle(double x, double y, double r) = 0;
};已有不兼容的类(Adaptee)
假设第三方库提供了一个 LegacyShapeRenderer,接口完全不同:
class LegacyShapeRenderer {
public:
void renderCircleAt(double centerX, double centerY, double radiusInPixels) {
std::cout << "Legacy: drawing circle at ("
<< centerX << ", " << centerY
<< ") with radius " << radiusInPixels << "\n";
}
};实现适配器(Object Adapter)
通过组合持有 LegacyShapeRenderer 实例,并在 drawCircle 中转调其方法。注意单位/参数语义的转换(如这里假设像素单位无需换算):
class DrawerAdapter : public IDrawer {
p
rivate:
LegacyShapeRenderer legacyRenderer;
public:
void drawCircle(double x, double y, double r) override {
// 转换调用:参数名、顺序、含义都做了适配
legacyRenderer.renderCircleAt(x, y, r);
}
};
客户端使用
客户端只依赖 IDrawer,完全 unaware 底层是新实现还是旧库封装:
int main() {
DrawerAdapter adapter;
IDrawer* drawer = &adapter;
drawer->drawCircle(10.5, 20.0, 5.0); // 输出 Legacy 日志
return 0;
}
若需运行时切换被适配对象(比如支持多个 legacy 类),可将 LegacyShapeRenderer 改为指针或智能指针,并在构造函数注入;类适配器(继承 LegacyShapeRenderer)也可行,但 C++ 不支持多继承时受限,且紧耦合 legacy 类的实现细节。
# c++
# Object
# 封装
# 构造函数
# 指针
# 继承
# 多继承
# 接口
# 对象
# 不兼容
# 客户端
# 并在
# 这是
# 协同工作
# 多个
# 已有
# 不支持
# 可将
# 第三方
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
无锡营销型网站制作公司,无锡网选车牌流程?
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
如何登录建站主机?访问步骤全解析
如何在阿里云完成域名注册与建站?
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何在服务器上三步完成建站并提升流量?
如何在宝塔面板中修改默认建站目录?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
如何用免费手机建站系统零基础打造专业网站?
详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南
如何利用DOS批处理实现定时关机操作详解
黑客如何通过漏洞一步步攻陷网站服务器?
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
Laravel Admin后台管理框架推荐_Laravel快速开发后台工具
PHP 500报错的快速解决方法
长沙做网站要多少钱,长沙国安网络怎么样?
如何快速搭建高效WAP手机网站吸引移动用户?
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
南京网站制作费用,南京远驱官方网站?
Mybatis 中的insertOrUpdate操作
zabbix利用python脚本发送报警邮件的方法
如何在阿里云服务器自主搭建网站?
如何在万网自助建站平台快速创建网站?
微信小程序 五星评分(包括半颗星评分)实例代码
Python数据仓库与ETL构建实战_Airflow调度流程详解
如何在万网自助建站中设置域名及备案?
Laravel怎么调用外部API_Laravel Http Client客户端使用
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
如何在阿里云香港服务器快速搭建网站?
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
网易LOFTER官网链接 老福特网页版登录地址
EditPlus中的正则表达式实战(6)
Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率
香港服务器选型指南:免备案配置与高效建站方案解析
js实现点击每个li节点,都弹出其文本值及修改
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
Java遍历集合的三种方式
BootStrap整体框架之基础布局组件
昵图网官方站入口 昵图网素材图库官网入口
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
魔方云NAT建站如何实现端口转发?
Python3.6正式版新特性预览
高防服务器租用指南:配置选择与快速部署攻略
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
Laravel如何实现文件上传和存储?(本地与S3配置)


rivate:
LegacyShapeRenderer legacyRenderer;