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 {
private:
    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配置)