C++设计模式——桥接模式

C++结构型模式-桥接模式 使用C++实现桥接模式 阅读详情

问题描述

现在要去画一个图形,图形有长方形、圆形和扇形等等;而图形又可以加上不同的颜色,然后,我们就可以画出红色的长方形,绿色的长方形;红色的圆形,绿色的圆形等等。而这种图形的形状在变化,图形的颜色也在变化,当使用代码去实现时,如何面对这种多方面的变化呢?这就要说到今天的桥接模式了。

 

什么是桥接模式?

对于上述的图形与颜色的问题时,很多时候,我们让各个图形类继承颜色类,比如:

class CShape
{
};
class CRectangle : public CShape
{
};
class CCircle : public CShape
{
};
class CColor
{
};
class CRed : public CColor
{
};
class CBlue : public CColor
{
};
class CRedRectangle : public CRed
{
};
class CBlueRectangle : public CBlue
{
};

每当我们增加一个新的图形,或者增加一种新的颜色时,对应的类就会以相乘的速度进行增加。当系统中的类变的多时,对应的管理也就变的复杂,这不是我们希望看到的。同时,我们可以看到CRedRectangle类继承自CRed类,这种继承关系合理吗?且不说有的系统是如此实现的,红色的矩形是红色吗?很显然,CRedRectangle和CRed之间不是一种is-a的关系,所以,上面的实现是及其不合理的。那么它们是什么关系呢?接着往下看。

在GOF的《设计模式:可复用面向对象软件的基础》一书中对桥接模式是这样说的:将抽象部分和它的实现部分分离,使它们都可以独立的变化。简单粗暴的说,就是抽象对外提供调用的接口;对外隐瞒实现部分,在抽象中引用实现部分,从而实现抽象对实现部分的调用,而抽象中引用的实现部分可以在今后的开发过程中,切换成别的实现部分。

 

为什么要使用桥接模式?

当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立的进行修改、扩充和重用。桥接模式把依赖具体实现,提升为依赖抽象,来完成对象和变化因素之间的低耦合,提高系统的可维护性和扩展性。桥接模式的主要目的是将一个对象的变化与其它变化隔离开,让彼此之间的耦合度最低。

 

什么时候使用桥接模式?

  1. 如果不希望在抽象和它的实现部分之间有一个固定的绑定关系,也就是继承关系;如果我们打破了这种固定的绑定关系,以后,就可以方便的在抽象部分切换不同的实现部分;
  2. 如果希望类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充;如果不使用桥接模式,使用继承去实现时,在抽象类中添加一个方法,则在对应的实现类中也需要做对应的改动,这种实现不符合松耦合的要求;
  3. 如果要求对一个抽象的实现部分的修改对客户不产生影响,即客户的代码不需要重新编译,在后面的项目经验会说这方面;
  4. 如果想对客户完全隐藏抽象的实现部分;
  5. 如果一个对象有多个变化因素的时候,通过抽象这些变化因素,将依赖具体实现,修改为依赖抽象;
  6. 如果某个变化因素在多个对象中共享时,可以抽象出这个变化因素,然后实现这些不同的变化因素。

上面使用的场景,是一种建议,也是一种参考。在项目中要很好的把握一个设计模式,是有一定的难度的;当在实际项目中遇到满足上面的一点或者几点时,可以考虑使用桥接模式。

UML类图

Abstraction类定义了抽象类的接口,并且维护一个指向Implementor实现类的指针;

RefineAbstraction类扩充了Abstraction类的接口;

Implementor类定义了实现类的接口,这个接口不一定要与Abstraction的接口完全一致;实际上,这两个接口可以完全不同;

ConcreteImplementor类实现了Implementor定义的接口。

 

代码实现

#include <iostream>
using namespace std;
class Implementor
{
public:
     virtual void OperationImpl() = 0;
};
class ConcreteImpementor : public Implementor
{
public:
     void OperationImpl()
     {
          cout<<"OperationImpl"<<endl;
     }
};
class Abstraction
{
public:
     Abstraction(Implementor *pImpl) : m_pImpl(pImpl){}
     virtual void Operation() = 0;
protected:
     Implementor *m_pImpl;
};
class RedfinedAbstraction : public Abstraction
{
public:
     RedfinedAbstraction(Implementor *pImpl) : Abstraction(pImpl){}
     void Operation()
     {
          m_pImpl->OperationImpl();
     }
};
int main(int argc, char *argv[])
{
     Implementor *pImplObj = new ConcreteImpementor();
     Abstraction *pAbsObj = new RedfinedAbstraction(pImplObj);
     pAbsObj->Operation();
     delete pImplObj;
     pImplObj = NULL;
     delete pAbsObj;
     pAbsObj = NULL;
     return 0;
}

根据对代码的理解,能想象到CRedRectangle和CRed是什么关系吗?我们可以理解为红色的矩形包含红色,也就是包含的关系,也就是软件设计中的组合关系(has-a)。

 

项目经验

这是一个我经历的项目,也是做起来比较轻松的一个项目。项目是这样的,需要对一个中间的通信库进行改写,保留以前的通信方式的同时,需要使用一种新的通信协议去和底层模块进行通信。现有的代码是一个COM程序,向外提供了可以调用的接口。根据客户提供的源码,我们进行了分析;在分析之前,我们有一种担心,就是怕用户的代码是接口和实现混在一起的;但是,分析之后,让我们很吃惊,客户的代码结构很清晰,层次非常清楚,代码中使用的就是我们今天这里说的桥接模式。由于抽象的接口和实现完全进行了分离,我们在进行重写时,只需要实现我们的一个类,然后在接口中引用我们实现的类,就大功告成了,这样做到了客户端不需要做任何修改,就可以完美的替换掉原来的通信层,真的是前人栽树树,后人乘凉啊。

 

总结

桥接模式使得抽象和实现进行了分离,抽象不用依赖于实现,让抽象和实现部分各自修改起来都很方便,使用组合(就是Abstraction类中包含了Implementor)的方式,降低了耦合度,同时也有助于分层,从而产生更好的结构化系统。通过实际的项目经验,使用了桥接模式的代码,对以后的扩展有很大的帮助。

设计模式C++实现(10)——桥接模式 软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大 阅读详情

相关推荐

C++设计模式7:桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分和实现部分分离,使它们可以独立地变化。这种模式通过将继承关系转化为组合关系来解决类间的耦合问题。在桥接模式中,抽象部分由一个抽象类或接口来定义,它包含了一些抽象方法和属性,这些方法和属性需要由具体的实现类来实现。而实现部分则由一个实现类或接口来定义,它也包含了一些实现方法和属性,这些方法和属性需要被抽象部分调用。桥接模式的核心思想就是将抽象部分和实现部分分离,使它们可以独立地变化。

琅嬛福地 678

【19】c++设计模式——>桥接模式

C++的桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使得它们可以独立地变化。桥接模式的核心思想是利用组合关系代替继承关系,将系统划分成多个独立的、功能不同的类层次结构,并通过桥接类将它们连接起来。在桥接模式中,有两个重要的概念:抽象化(Abstraction)和实现化(Implementation),它们分别对应了系统的抽象部分和实现部分。抽象化负责定义接口,并维护一个指向实现化对象的指针;实现化则负责定义具体的实现方法。

weixin_42097108的博客 829

C++桥接模式:优雅解耦的设计模式

桥接模式属于结构型设计模式,它通过将抽象与实现分离,使它们可以独立地变化,从而提高系统的灵活性和可扩展性。在桥接模式中,抽象部分通常由一个抽象类或接口表示,而实现部分则由一个或多个具体类实现。通过桥接模式,可以在不修改现有代码的情况下,动态地将不同的抽象与实现部分组合起来,以满足不同的需求。桥接模式是一种有助于解耦抽象与实现的设计模式。它通过将抽象部分和实现部分分离,使它们可以独立地变化,从而提高系统的灵活性和可扩展性。

ByteEchoX的博客 183

C++ 设计模式 —— 桥接模式

桥接模式的定义桥接模式的作用桥接模式,顾名思义,就像是一座连接两岸的桥梁。在软件开发中,我们可以将桥接模式看作是一座连接抽象部分和实现部分的“桥”,通过这座“桥”,我们可以方便地在抽象部分和实现部分之间进行切换,而不需要关心它们之间的实现细节。桥接模式的核心作用就是降低系统的耦合度,提高扩展性和可维护性。想象一下你正在修建一座连接两个城市的大桥,如果没有这座桥,你需要绕行很远的距离才能到达对岸。

莫寒技术人生 1066

iOS自动化之打包-xcodebuild命令行打包.app并安装到ios模拟器

xcode xcodebuild xcrun ios模拟器 iOS UI自动化测试 ios自动打包安装到ios模拟器

z12347891的博客 5073

SAR成像系列:【9】合成孔径雷达(SAR)成像算法-波数域(omega-K)成像算法[也叫距离徙动(RM)算法](附Matlab代码)

合成孔径雷达(SAR)波数域(wK)成像算法也称为距离徙动(RM)算法,它不存在近似条件,可以对整个成像区域基于散射点模型进行精确聚焦。有的文章中称它为SAR成像的最佳实现。

zr2006_7的专栏 1万+

C++ 设计模式——桥接模式

桥接模式是一种结构型设计模式,它将抽象部分与实现部分分离,使它们都可以独立地变化。这种模式通过组合的方式来代替继承,增加了系统的灵活性。

慢慢记录,慢慢更新。 2178

无人机WIFI集群组网技术详解及成本分析

无人机WIFI集群组网技术是指利用无人机作为移动平台,通过集成高性能的WIFI模块,实现多架无人机之间以及无人机与地面控制站之间的无线通信组网。在协议层面,无人机WIFI集群组网需要遵循标准的无线通信协议,如IEEE 802.11系列(即WIFI标准),同时可能还需定制或优化路由协议、媒体访问控制(MAC)协议等,以确保高效、可靠的数据传输。数据安全与隐私保护:无人机集群组网中传输的数据可能涉及敏感信息,需采取加密、认证等安全措施,确保数据传输的安全性和用户隐私的保护。根据性能不同,价格差异较大。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 1582

C++设计模式(11)——桥接模式

C++桥接模式

伍粟的博客 1467

详细推导波特图增益和相位曲线

最近因为项目需求,在回看波特图方面的内容。大三那会,《自动控制原理》这本书里面就讲过这些东西,但是那时候总感觉学这些没啥用,反正以后也用不到,对这种课程的重视度不是很高。 工作后发现,只要你从事的是和本专业相关的工作,大学学过的很多理论课程在后面大概率都会用到。曾经那些我们在学校以为用不上的东西,熟不知在后面用处还多着呢。所以啊,仅仅只是我们的以为而已! 现在还在学校的同学,对待《自动控制理论》、《信号与系统》、《通信原理》这样的核心专业课,建议还是好好学习一下,认真听听课。哪怕是考试完以后就会忘掉,但当我

D_Katter的博客 3936

Backtrader Web:开源量化交易全栈平台

Backtrader Web是一个基于Backtrader框架的现代化量化交易全栈平台,将专业回测引擎与Web技术结合,提供从策略开发到实盘交易的完整解决方案。平台采用FastAPI+Vue3技术栈,具有118个内置策略模板、专业可视化分析工具和完整的策略生命周期管理功能。支持策略版本控制、参数优化、模拟/实盘交易及监控告警,通过RESTful API和WebSocket实现前后端交互。系统采用模块化设计,包含策略服务、回测服务等核心模块,支持SQLite/PostgreSQL等多种数据库。安装简单,5分钟

云金杞 641

C++设计模式——桥接模式(Bridge Pattern)

C++设计模式——桥接模式(Bridge Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——桥接模式(Bridge Pattern)目录引言定义定义结构代码示例总结桥接模式和策略模式桥接模式和适配器模式适用场景优缺点参考资料 引言 假如有三个品牌的手机vivo,oppo和小米,如果手机手机壳一体生产,会是这样的: 对应到相应的类中,将是1+3+6=10个有继承关系的类,如果这时再加一个华为手机,无疑是要多增加3个类,会带来类的急剧增长。 如果手机手机壳分开生产,然后按需搭配,

leonardohaig的博客 1411

92. SAP ABAP 系统里长文本 Long Text 的设计和读取函数 READ_TEXT 的详细讲解

SAP ABAP中的长文本(Long Text)是指在SAP系统中存储和管理较长文本信息的一种机制。长文本通常用于存储描述性信息、注释、说明等,这些文本信息可能超过了标准数据库表字段的长度限制。 长文本的作用主要有以下几点: 1. 更多的信息存储:长文本允许您存储和显示比标准表字段允许的更多信息。例如,产品描述、用户注释、维护计划等可能需要大量的文本来详细描述。 2. 更好的可读性:长文本提供了更好的文本格式化选项,可以改善可读性。用户可以使用段落、列表、字体样式等格式化文本,以便更容易地理解和阅读。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1993

C++设计模式——桥接模式(bridge pattern)

一、原理讲解 1.1意图 将抽象部分和实现部分分离,使它们可以独立的变化。(别名:handle/body) 1.2应用场景 当你不希望抽象和它的实现部分有一种紧密耦合关系,希望在运行时可以切换不同的实现; 类的抽象和实现都可以通过继承子类的方法进行扩充,这时可以选着桥接模式,运用组合方式分别对抽象和实现进行扩充; 当你像完全对客户隐藏抽象时,可以使用桥接模式;(继承时,抽象是可见的) 当你像抽象有多个扩展,实现也有多个方向扩展时使用。’ 1.3结构图(UML图) 桥接模式UML图 1.4

净无邪博客 2423

YOLO26 无损剪枝:稀疏训练 + 结构化通道裁剪

YOLO26 无损剪枝链路:YOLO26s (7.2M) → 稀疏训练 30 epoch (L1 on BN gamma, lam=0.01) → 阈值剪枝 50% (gamma<quantile(0.5)) → 结构化重建 Conv+BN → 微调 10 epoch (lr=1e-4) → YOLO26n (1.9M, mAP50 0.808, 仅降 0.6%)。核心贡献:稀疏训练让 BN gamma 趋向二元分布 (近 0 或近 1), 剪枝阈值可直接取 median 自动 50% 压缩。

m0_64661770的博客 263

RedCap:一种通信技术的概述

总结起来,RedCap是一种基于数据包交换的通信技术,它提供了一种高效、可靠的数据传输机制。通过使用RedCap,我们可以轻松地发送和接收数据包,并确保数据的完整性和正确性。在上面的示例中,我们首先导入了RedCap库,并创建了一个RedCap实例。然后,我们定义了目标地址和源地址,并创建了一个数据包,其中包含了目标地址、源地址和要发送的数据。本文将介绍RedCap的基本原理和使用方法,并提供一些相关的源代码示例。RedCap还提供了其他一些功能,如数据包的重传机制、流量控制和拥塞控制等。

YgjWeb的博客 899

【c++设计模式10】结构型2:桥接模式(Bridge Pattern)

定义桥接模式(Bridge Pattern)定义了两个独立变化的维度,即抽象和实现,通过组合的方式将抽象部分和实现部分连接在一起,从而使得它们可以独立地进行扩展和变化。桥接模式通过将抽象部分的方法委派给实现部分,可以使得抽象部分和实现部分可以独立地进行演化。桥接模式通过组合而不是继承的方式实现了两个独立变化维度之间的解耦,提高了系统的灵活性。

junxuezheng的博客 1175

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++ 设计模式:桥接模式(Bridge Pattern)

C++ 设计模式:桥接模式(Bridge Pattern)

冀晓武的博客 678

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

大话设计模式桥接模式c++实现

桥接模式 其他二十三种设计模式 #include<iostream> using namespace std; //桥接模式:将抽象部分与实现部分分离,使它们可以独立变化 //实现部分类 class Implementor { public: virtual void Operation() = 0; }; //具体实现类 class ConcreteImplementorA :public Implementor { public: virtual void Operation()

wode_0828的博客 204

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

设计模式之桥接模式(C++实现)

桥接模式介绍,包括应用场景,优缺点,模式结构,类图 以及 C++代码示例

墨1024 1478

C++ 设计模式之桥接模式

C++ 设计模式之桥接模式

L_qingting的博客 650

设计模式——桥接模式(C++实现)

桥接模式 将抽象部分与它的实现部分分离,使它们都可以独立的变化。属于结构型模式。通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 适用场景 1、你不希望在抽象和它的实现部分之间有一个固定的绑定关系。 例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。 2、类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时 ...

Skynet的博客 344

c++设计模式(桥接模式)

说点废话。自从决定从家乡走出来闯荡,也有大半年了,无时无刻不在提醒自己,放弃了原来的工作,放弃了安逸的环境,图个什么?目标是什么?可是人就是个奇怪的生物,懒劲儿一上来啊,那是止都止不住,惭愧啊!所以啊,博客这种东西对我来说,除了记录学习过程,最大的作用,就是督促自己了啊!没办法,自制力不够,又不是小孩子了,没人催着你了,只能自己想办法,共勉...... 设计模式,我都是跟着大...

Hyl的博客 222

C++设计模式之桥接模式

C++ 设计模式之桥接模式 将抽象部份与它的实现部份分离,使它们都可以独立地变化。 C 设计模式之桥接模式 一缘由 二实现 三代码 四总结 一、缘由假设现在需要大、中、小、三种型号的画笔来绘制7种不同的颜色,如果使用蜡笔,就需要准备 3*7 = 21支蜡笔。而如果使用毛笔,则只需要3支毛笔和7中颜料。显然使用毛笔的形式要比蜡笔简单许多,这其中缘由在于在蜡笔这个对象中型号和颜料两个不同维度的因素耦

李兰溪的专栏 983

C++结构型设计模式之桥接模式

例如,一个图形绘制系统中,图形可以是圆形、矩形等,而颜色可以是红色、蓝色等。在图形绘制系统中,图形可以是圆形、矩形等,颜色可以是红色、蓝色等。:当需要在运行时动态地切换实现时,桥接模式允许抽象和实现可以独立变化,从而避免永久绑定。通过这种方式,我们可以灵活地组合不同的设备和控制器,而不需要为每种组合创建大量的子类。通过这种结构,桥接模式允许抽象和实现可以独立变化,从而增强了系统的灵活性和可扩展性。:当需要分离抽象和实现,使得它们可以独立变化时,桥接模式是一个合适的选择。

捕鲸叉的专栏 1299
上一篇: C++设计模式——适配器模式
下一篇: C++设计模式——组合模式
CoderAldrich
博客等级 码龄12年 431粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值