0

0

C++桥接模式实现抽象与实现分离

P粉602998670

P粉602998670

发布时间:2025-09-04 08:18:01

|

537人浏览过

|

来源于php中文网

原创

桥接模式的核心思想是将抽象与实现分离,通过组合而非继承使二者独立变化。它解决了类爆炸、继承僵化和代码重复问题。在C++中,通过抽象基类定义接口,具体类实现细节,抽象类持有指向实现的指针,从而实现解耦与灵活扩展。

c++桥接模式实现抽象与实现分离

C++的桥接模式,说白了,就是把一个类的抽象部分和它的实现部分彻底分离开来。这样一来,你就能让这两部分独立地变化,互不干扰。它不是什么魔法,而是一种深思熟虑的设计策略,目的就是为了解耦,让系统更灵活,更易于扩展。

解决方案: 桥接模式通过引入一个抽象层来连接抽象和实现。想象一下,你有一个高层概念(比如“图形”),它有很多种变体(圆形、方形),同时这些变体又可以用不同的方式绘制(OpenGL、DirectX)。如果直接让每种图形都去实现每种绘制方式,类会爆炸式增长。桥接模式的做法是,让“图形”持有“绘制器”的接口,而不是直接依赖具体的绘制器。这样,“图形”家族只需要关心自己的几何特性,而“绘制器”家族则专注于图形的渲染细节。当需要添加新的图形或新的绘制方式时,你只需要在相应的家族中添加新成员,而不需要修改已有的代码。这种“我只管我的抽象,你只管我的实现”的哲学,正是其核心魅力。

桥接模式的核心思想是什么?它解决了哪些常见问题?

要理解桥接模式,我们得从它的名字入手——“桥接”。它搭建了一座桥梁,连接了两个原本可能紧密耦合、甚至纠缠不清的维度:抽象(Abstraction)和实现(Implementation)。在我看来,它的核心思想,就是一种对“变化”的深刻洞察和优雅应对。它认识到,在软件世界里,很多时候我们面对的不是单一维度的变化,而是多个维度的独立变化。比如,一个“通知”系统,它的内容可以是文本、图片,这是一种抽象的变化;同时,它可以通过邮件、短信、App推送发送,这是另一种实现的变化。

如果不用桥接模式,我们可能会创建一个庞大的类层次结构,比如

TextEmailNotification
ImageEmailNotification
TextSMSNotification
等等。这种方式的弊端显而易见:

  • 类爆炸(Class Explosion):每增加一个抽象或一个实现,类的数量就会呈乘法级增长。
  • 僵硬的继承体系:一旦继承关系确定,要修改或扩展某个维度,往往牵一发而动全身,需要修改很多地方,甚至重新编译。
  • 代码重复:不同组合之间可能存在大量的相似代码。

桥接模式解决的,正是这些痛点。它通过将抽象和实现封装在独立的类层次结构中,并让抽象通过组合(而非继承)的方式引用实现,从而实现了两者之间的解耦。抽象层只定义高层操作,而将具体操作委托给实现层。这样,抽象和实现可以独立地演化,互不影响。这不仅仅是代码层面的分离,更是一种设计理念上的解放,让我们可以更自由地思考和构建系统。

立即学习C++免费学习笔记(深入)”;

成新网络商城购物系统
成新网络商城购物系统

使用模板与程序分离的方式构建,依靠专门设计的数据库操作类实现数据库存取,具有专有错误处理模块,通过 Email 实时报告数据库错误,除具有满足购物需要的全部功能外,成新商城购物系统还对购物系统体系做了丰富的扩展,全新设计的搜索功能,自定义成新商城购物系统代码功能代码已经全面优化,杜绝SQL注入漏洞前台测试用户名:admin密码:admin888后台管理员名:admin密码:admin888

下载

如何在C++中实现桥接模式?提供一个具体示例。

在C++中实现桥接模式,通常会用到抽象基类和多态。我们创建一个抽象的“实现者”接口(Implementor),然后有多个具体的实现者(Concrete Implementor)。同时,我们有一个抽象的“抽象者”(Abstraction),它内部持有一个指向“实现者”接口的指针或智能指针。

让我们以一个简单的“设备遥控器”为例。遥控器是抽象,它可以控制不同的设备(电视、音响)。设备是实现。

#include 
#include  // For std::unique_ptr

// 1. 实现者接口 (Implementor)
// 定义了所有具体实现类必须实现的操作
class Device {
public:
    virtual ~Device() = default;
    virtual void turnOn() = 0;
    virtual void turnOff() = 0;
    virtual void setChannel(int channel) = 0;
};

// 2. 具体实现者 (Concrete Implementor)
// 实现了Device接口的具体行为
class TV : public Device {
public:
    void turnOn() override {
        std::cout << "TV: Power On." << std::endl;
    }
    void turnOff() override {
        std::cout << "TV: Power Off." << std::endl;
    }
    void setChannel(int channel) override {
        std::cout << "TV: Setting channel to " << channel << std::endl;
    }
};

class Radio : public Device {
public:
    void turnOn() override {
        std::cout << "Radio: Power On." << std::endl;
    }
    void turnOff() override {
        std::cout << "Radio: Power Off." << std::endl;
    }
    void setChannel(int frequency) override { // 这里频道可以理解为频率
        std::cout << "Radio: Tuning to frequency " << frequency << " MHz." << std::endl;
    }
};

// 3. 抽象者 (Abstraction)
// 包含一个指向Implementor的指针,并定义高层操作
class RemoteControl {
protected:
    std::unique_ptr device; // 使用智能指针管理实现对象

public:
    // 构造函数注入实现者
    explicit RemoteControl(std::unique_ptr dev) : device(std::move(dev)) {}
    virtual ~RemoteControl() = default;

    virtual void powerOn() {
        device->turnOn();
    }
    virtual void powerOff() {
        device->turnOff();
    }
    virtual void changeChannel(int channel) {
        device->setChannel(channel);
    }
};

// 4. 精确抽象者 (Refined Abstraction)
// 扩展Abstraction,提供更复杂的操作
class AdvancedRemoteControl : public RemoteControl {
public:
    explicit AdvancedRemoteControl(std::unique_ptr dev) : RemoteControl(std::move(dev)) {}

    void mute() {
        std::cout << "Remote: Muting device." << std::endl;
        // 实际上可能调用device的某个特定方法,这里简化
        // device->mute(); // 如果Device接口有mute方法
    }
    // 可以添加更多高级功能
};

// 使用示例
int main() {
    // 控制电视
    std::unique_ptr myTV = std::make_unique();
    RemoteControl basicTVRemote(std::move(myTV));
    basicTVRemote.powerOn();
    basicTVRemote.changeChannel(5);
    basicTVRemote.powerOff();

    std::cout << "--------------------" << std::endl;

    // 控制收音机
    std::unique_ptr myRadio = std::make_unique();
    AdvancedRemoteControl advancedRadioRemote(std::move(myRadio));
    advancedRadioRemote.powerOn();
    advancedRadioRemote.changeChannel(98); // 假设98MHz
    advancedRadioRemote.mute(); // 高级遥控器特有功能
    advancedRadioRemote.powerOff();

    return 0;
}

在这个例子里,

RemoteControl
AdvancedRemoteControl
是抽象层,它们不关心底层是
TV
还是
Radio
。它们通过
Device
接口与实现层交互。
TV
Radio
是实现层,它们各自实现了
Device
接口。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1155

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

214

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1949

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

22

2026.01.19

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

469

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.12.06

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

8

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Java 教程
Java 教程

共578课时 | 53.5万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号