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

桥接模式C++

桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过引入一个桥梁接口,将抽象层和实现层解耦,从而允许两者独立扩展。

桥接模式的核心角色

  1. Abstraction(抽象类):定义抽象接口,包含一个对实现类接口的引用
  2. RefinedAbstraction(扩展抽象类):扩展抽象类的接口
  3. Implementor(实现类接口):定义实现类的接口,供抽象类调用
  4. ConcreteImplementor(具体实现类):实现实现类接口的具体方法

C++实现示例

以下以"图形渲染"为例实现桥接模式,将图形的形状(抽象部分)与渲染方式(实现部分)分离,使它们可以独立变化:


#include <iostream>
#include <string>// 实现类接口:渲染器(桥接的实现部分)
class Renderer {
public:virtual ~Renderer() = default;virtual void renderCircle(float radius) = 0;virtual void renderSquare(float side) = 0;
};// 具体实现类1:软件渲染
class SoftwareRenderer : public Renderer {
public:void renderCircle(float radius) override {std::cout << "软件渲染圆形,半径: " << radius << std::endl;}void renderSquare(float side) override {std::cout << "软件渲染正方形,边长: " << side << std::endl;}
};// 具体实现类2:硬件渲染
class HardwareRenderer : public Renderer {
public:void renderCircle(float radius) override {std::cout << "硬件加速渲染圆形,半径: " << radius << std::endl;}void renderSquare(float side) override {std::cout << "硬件加速渲染正方形,边长: " << side << std::endl;}
};// 抽象类:形状(桥接的抽象部分)
class Shape {
protected:Renderer* renderer;  // 持有实现部分的引用(桥接)// 保护构造函数,只能被子类调用Shape(Renderer* rend) : renderer(rend) {}public:virtual ~Shape() = default;virtual void draw() = 0;    // 绘制形状virtual void resize(float factor) = 0;  // 调整大小
};// 扩展抽象类1:圆形
class Circle : public Shape {
private:float radius;public:Circle(Renderer* rend, float r) : Shape(rend), radius(r) {}void draw() override {renderer->renderCircle(radius);  // 调用实现部分}void resize(float factor) override {radius *= factor;}
};// 扩展抽象类2:正方形
class Square : public Shape {
private:float side;public:Square(Renderer* rend, float s) : Shape(rend), side(s) {}void draw() override {renderer->renderSquare(side);  // 调用实现部分}void resize(float factor) override {side *= factor;}
};// 客户端代码
int main() {// 创建不同的渲染器(实现部分)Renderer* software = new SoftwareRenderer();Renderer* hardware = new HardwareRenderer();// 创建不同的形状(抽象部分),并与渲染器桥接Shape* circle = new Circle(software, 5.0f);Shape* square = new Square(hardware, 10.0f);// 绘制形状std::cout << "第一次绘制:" << std::endl;circle->draw();square->draw();// 调整大小后再次绘制std::cout << "\n调整大小后绘制:" << std::endl;circle->resize(2.0f);square->resize(0.5f);circle->draw();square->draw();// 更换圆形的渲染器(动态改变实现)std::cout << "\n更换渲染器后绘制圆形:" << std::endl;delete circle;circle = new Circle(hardware, 5.0f);circle->draw();// 清理资源delete circle;delete square;delete software;delete hardware;return 0;
}

代码解析

  1. Renderer类:实现类接口,定义了渲染圆形和正方形的接口方法,是桥接模式中的"实现部分"。

  2. SoftwareRenderer和HardwareRenderer:具体实现类,分别提供了软件渲染和硬件加速渲染的具体实现。

  3. Shape类:抽象类,定义了形状的基本接口(绘制和调整大小),并持有一个Renderer指针作为桥梁,连接抽象部分和实现部分。

  4. Circle和Square:扩展抽象类,继承自Shape并实现了具体形状的绘制和调整大小方法,通过调用Renderer的方法完成实际渲染。

  5. 桥接关系:形状(抽象部分)不直接实现渲染功能,而是通过Renderer(实现部分)完成,使形状和渲染方式可以独立变化。

桥接模式的优缺点

优点

  • 分离抽象与实现,使两者可以独立扩展,符合开放-封闭原则
  • 减少子类数量,避免了抽象与实现的组合爆炸(如2种形状×2种渲染=4种组合,而非传统继承的4个子类)
  • 可以动态切换实现方式,提高系统灵活性
  • 隐藏实现细节,抽象层只需关注自身接口

缺点

  • 增加了系统的复杂度,理解和设计难度较大
  • 需要正确识别系统中的抽象层和实现层,否则可能滥用模式

适用场景

  • 当一个类存在两个独立变化的维度,且这两个维度都需要扩展时
  • 当需要避免抽象部分与实现部分的紧耦合时
  • 当希望动态切换实现方式时
  • 当系统中存在多个层次的继承关系,导致类数量急剧增加时

常见应用:

  • 图形界面中的窗口系统(窗口样式与绘制系统分离)
  • 跨平台应用开发(业务逻辑与平台相关实现分离)
  • 数据库驱动(数据访问抽象与具体数据库实现分离)
  • 消息系统(消息格式与传输协议分离)

桥接模式与适配器模式的区别:桥接模式是在设计初期就将抽象与实现分离,而适配器模式是在已有接口不兼容时进行适配。

http://www.dtcms.com/a/330590.html

相关文章:

  • 成都国际影像产业园:接重庆五一职院实训就业考察
  • [系统架构设计师]软件工程基础知识(五)
  • 系统思考:转型困扰与突破
  • 【软考中级网络工程师】知识点之入侵检测深度剖析
  • 开源安全云盘存储:Hoodik 实现端到端数据加密,Docker快速搭建
  • 分享一个基于Hadoop+spark的超市销售数据分析与可视化系统,超市顾客消费行为分析系统的设计与实现
  • Java应用架构实战指南:主流模式解析与Spring落地实践
  • 从零开始学Python之数据结构(字符串以及数字)
  • Java 大视界 -- Java 大数据机器学习模型在金融欺诈检测与防范策略制定中的应用(397)
  • 工业一体机5G通讯IC/ID刷卡让MES系统管理更智能
  • 第四天~在CANFD或CAN2.0的ARXML文件中实现Multiplexor多路复用信号实战
  • 怎么判断晶振的好坏,有什么简单的办法
  • AR技术赋能电力巡检:智能化升级的“秘密武器”
  • 计算机视觉(opencv)实战三——图像运算、cv2.add()、cv2.addWeighted()
  • 设计模式笔记_行为型_责任链模式
  • 【论文阅读 | CVPR 2024 | UniRGB-IR:通过适配器调优实现可见光-红外语义任务的统一框架】
  • linux 内核 - 内存管理的层次化结构
  • UE5配置MRQ编解码器输出MP4视频
  • Linux网络编程:应用层自定义协议与序列化
  • 《量子雷达》第5章 量子雷达发射机 预习2025.8.14
  • 人工智能——卷积神经网络自定义模型全流程初识
  • .NET 的 WebApi 项目必要可配置项都有哪些?
  • CPUcores-【硬核优化】CPU增强解锁全部内核!可优化游戏性能、提升帧数!启用CPU全内核+超线程,以更高优先级运行游戏!支持各种游戏和应用优化~
  • Mybatis学习笔记(四)
  • 【论文阅读】基于卷积神经网络和预提取特征的肌电信号分类
  • CSS isolation属性
  • NVIDIA Nsight Deep Learning Designer使用
  • 第3节 深度学习避坑指南:从过拟合到玄学优化
  • toRefs、storeToRefs实际应用
  • 分布式系统架构设计模式:从微服务到云原生