全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何实现一个适配器(Adapter)设计模式?(代码示例)

适配器模式通过转换接口使不兼容类协同工作,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  # 封装  # 构造函数  # 指针  # 继承  # 多继承  # 接口  # 对象  # 不兼容  # 客户端  # 并在  # 这是  # 协同工作  # 多个  # 已有  # 不支持  # 可将  # 第三方 


相关文章: 兔展官网 在线制作,怎样制作微信请帖?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  香港服务器如何优化才能显著提升网站加载速度?  如何访问已购建站主机并解决登录问题?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  黑客如何通过漏洞一步步攻陷网站服务器?  如何通过主机屋免费建站教程十分钟搭建网站?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  存储型VPS适合搭建中小型网站吗?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何在新浪SAE免费搭建个人博客?  ,石家庄四十八中学官网?  建站之家VIP精选网站模板与SEO优化教程整合指南  如何基于云服务器快速搭建网站及云盘系统?  平台云上自主建站:模板化设计与智能工具打造高效网站  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  如何在阿里云高效完成企业建站全流程?  制作农业网站的软件,比较好的农业网站推荐一下?  如何选择高效便捷的WAP商城建站系统?  中山网站推广排名,中山信息港登录入口?  如何快速搭建自助建站会员专属系统?  已有域名和空间如何快速搭建网站?  网站图片在线制作软件,怎么在图片上做链接?  如何通过宝塔面板实现本地网站访问?  长沙做网站要多少钱,长沙国安网络怎么样?  建站之星上传入口如何快速找到?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  三星网站视频制作教程下载,三星w23网页如何全屏?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  名字制作网站免费,所有小说网站的名字?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  制作网站怎么制作,*游戏网站怎么搭建?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  济南专业网站制作公司,济南信息工程学校怎么样?  太原网站制作公司有哪些,网约车营运证查询官网?  建站三合一如何选?哪家性价比更高?  家庭建站与云服务器建站,如何选择更优?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  建站主机默认首页配置指南:核心功能与访问路径优化  如何彻底删除建站之星生成的Banner?  如何通过FTP空间快速搭建安全高效网站?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  如何在橙子建站上传落地页?操作指南详解  如何在阿里云购买域名并搭建网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。