不得不说的结构型模式-桥接模式

news2024/11/6 3:15:56

 

桥接模式(Bridge Pattern)是一种结构型设计模式,它可以将抽象部分与实现部分分离,使得它们可以独立地变化。桥接模式的核心思想是将一个系统分成两个独立的部分,抽象部分和实现部分,并且让它们可以互相独立地变化。这样可以更加灵活地设计和实现系统,也可以降低系统的复杂度。

 

桥接模式包含以下几个角色:

  • 抽象化(Abstraction):定义抽象部分的接口,同时保存一个指向实现部分的引用。
  • 扩展抽象化(Refined Abstraction):对抽象化进行扩展,增加一些新的功能。
  • 实现化(Implementation):定义实现部分的接口。
  • 具体实现化(Concrete Implementation):实现实现化接口的具体类。

下面是一个使用桥接模式的示例:

#include <iostream>
using namespace std;

// 实现类
class Implementor {
public:
    virtual void OperationImpl() = 0;
};

class ConcreteImplementorA : public Implementor {
public:
    void OperationImpl() {
        cout << "ConcreteImplementorA::OperationImpl" << endl;
    }
};

class ConcreteImplementorB : public Implementor {
public:
    void OperationImpl() {
        cout << "ConcreteImplementorB::OperationImpl" << endl;
    }
};

// 抽象类
class Abstraction {
public:
    Abstraction(Implementor *pImp) {
        m_pImp = pImp;
    }
    virtual void Operation() = 0;
protected:
    Implementor *m_pImp;
};

class RefinedAbstraction : public Abstraction {
public:
    RefinedAbstraction(Implementor *pImp) : Abstraction(pImp) {}
    void Operation() {
        m_pImp->OperationImpl();
    }
};

int main() {
    Implementor *pImp = new ConcreteImplementorA();
    Abstraction *pAb = new RefinedAbstraction(pImp);
    pAb->Operation();
    delete pImp;
    delete pAb;

    pImp = new ConcreteImplementorB();
    pAb = new RefinedAbstraction(pImp);
    pAb->Operation();
    delete pImp;
    delete pAb;

    return 0;
}

在上面的示例中,我们定义了实现类 Implementor 和其两个具体子类 ConcreteImplementorA 和 ConcreteImplementorB。然后定义了抽象类 Abstraction 和其子类 RefinedAbstraction,其中 RefinedAbstraction 通过组合实现了与 Implementor 的桥接。最后在 main 函数中分别使用 ConcreteImplementorA 和 ConcreteImplementorB 来创建 RefinedAbstraction 对象,从而实现了在桥接模式中,将抽象部分与实现部分分离开来,使它们可以独立地变化。桥接模式通过将一个抽象类与它的实现类分离,使得它们可以独立地变化,从而增加了系统的灵活性和可扩展性。

桥接模式的主要好处是将抽象和实现分离开来,使它们可以独立地变化。这带来了以下几个好处:

桥接模式的灵活性和扩展性是由于其将抽象和实现分离的特点所带来的。具体表现在以下方面:

  1. 可以方便地切换和替换实现:在桥接模式中,抽象和实现是分离的,可以随时切换和替换不同的实现,而不影响抽象部分的代码。

  2. 可以方便地扩展和增加抽象和实现:由于抽象和实现是分离的,可以方便地增加新的抽象和实现,而不影响已有的代码。

  3. 可以方便地定制化实现:在桥接模式中,实现可以通过继承抽象类来定制化实现,从而满足不同的需求。

  4. 可以方便地适应变化:在桥接模式中,抽象和实现是分离的,可以方便地适应需求的变化,从而提高系统的灵活性。

在桥接模式中,抽象和实现是分离的,可以将多个抽象类和多个实现类进行组合,从而实现代码的复用。具体来说,桥接模式中的抽象类可以作为其他类的父类,实现类可以通过继承抽象类来重复利用代码。

例如,假设有两个具体的实现类,它们都实现了同一个抽象类的接口。在使用桥接模式时,可以将这两个实现类组合在一起,然后通过抽象类来进行访问。由于抽象类和实现类是分离的,因此可以随时切换和替换不同的实现类,而不影响抽象部分的代码,从而实现代码的复用。

此外,桥接模式中还可以将多个抽象类和多个实现类进行组合,实现更加复杂的功能,从而进一步提高代码的复用性。

抽象类只关注自身的接口,而不涉及具体的实现细节,实现类只关注具体的实现细节,而不涉及抽象接口。这种分离使得系统更加灵活和可扩展,也提高了系统的可维护性和可读性。

具体来说,桥接模式中抽象类只包含与实现类相关的接口,而实现类只包含具体实现细节,这使得系统在修改和扩展时变得更加简单。例如,如果需要修改某个实现类的实现细节,只需要修改该实现类的代码,而不需要修改抽象类的代码。这种分离还使得代码更加可读,因为抽象类和实现类的职责清晰明确,每个类都只关注自身的职责。

桥接模式还使得系统具有更高的可扩展性。可以通过添加新的抽象类和实现类来扩展系统功能,而不需要修改现有的代码,从而降低了代码修改的风险。

在桥接模式中,由于抽象类和实现类是分离的,因此可以很容易地对它们进行单独的测试,从而提高了测试的灵活性和可靠性。

具体来说,由于抽象类和实现类的职责清晰明确,测试人员可以在不影响其他模块的情况下,对抽象类和实现类进行单独测试。这样不仅可以提高测试的效率,而且还可以降低测试的风险,因为如果发现了某个模块的问题,只需要对该模块进行修改,而不需要对整个系统进行修改。

此外,由于桥接模式具有高度的扩展性,因此可以通过添加新的抽象类和实现类来扩展系统功能,从而增加测试的覆盖范围。这使得测试人员可以更好地发现系统中的问题,并提高系统的稳定性和可靠性。

桥接模式的缺点:

  1. 增加系统复杂度:桥接模式需要定义抽象和实现,增加了系统的复杂度。
  2. 增加代码量:桥接模式需要定义抽象和实现的类和它们之间的关系,增加了代码量。
  3. 不容易理解:桥接模式需要理解抽象和实现之间的关系,对于不熟悉该模式的开发人员来说,不容易理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/437674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sublime text的snippet介绍,提高编程效率

自定义Snippet Sublime Text 的 Snippet 是一种快捷方式&#xff0c;它允许您使用自定义模板或代码片段更快地编写代码。以下是创建 Snippet 的步骤&#xff1a; 打开 Sublime Text 编辑器并创建一个新文件。菜单栏选择 “Tools” -> “Developer” -> “New Snippet”…

python里面单双下划线的区别

区别&#xff1a; xx:公有变量&#xff0c;所有对象都可以访问&#xff1b; xxx:双下划线代表着是系统定义的名字。 __xxx&#xff1a;双前置下划线&#xff0c;避免与子类中的属性命名冲突&#xff0c;无法在外部直接访问。代表着类中的私有变量名。 _xxx&#xff1a;单前置…

【Maven 入门】第一章、Maven概述

一、什么是Maven&#xff1f; Maven是一款基于Java平台的强大构建工具&#xff0c;可用于管理和构建项目。它提供了一种易于使用的建立项目的方法&#xff0c;使开发者可以更快速、更高效地构建软件。 Maven的功能包括依赖管理、构建、发布、文档生成、测试在内的整个项目生命…

nodejs项目的轻量级数据持久化方案,node-json-db,直接使用json文件保存,查询数据。

前言 作为一名前端开发&#xff0c;我们做网站时&#xff0c;难免会遇到需要保存数据的场景&#xff0c;比如做一个小官网&#xff0c;没有注册&#xff0c;没有登陆&#xff0c;只有一个给我们提建议&#xff0c;如下面的&#xff0c; 网站上只有一处需要填写数据。 场景 …

RK3399平台开发系列讲解(PCI/PCI-E)PCIE相关配置说明

🚀返回专栏总目录 文章目录 一、DTS 配置二、menuconfig 配置三、cmdline 配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍在使用 RK3399 平台 PCIE 时候的配置。 一、DTS 配置 ep-gpios = <&gpio3 13 GPIO_ACTIVE_HIGH>; 此项是设置 PCIe…

3自由度并联绘图机器人实现写字功能

1. 功能说明 本文示例将实现R305样机3自由度并联绘图机器人写字的功能。 2. 电子硬件 在这个示例中&#xff0c;采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板Bigfish2.1扩展板电池7.4V锂电池 3. 功能…

Jenkins集成SonarQube实现代码质量检查

文章目录 一、前提配置1.1 安装及配置SonarQube Scanner插件1.2 配置SonarQube servers 二、非流水线集成SonarQube1.1 配置非流水线任务 三、流水线集成SonarQube 一、前提配置 1.1 安装及配置SonarQube Scanner插件 (1) 点击【系统管理】>【插件管理】>【可选插件】搜…

Netty核心模块、核心组件理解

文章目录 一、入门案例二、Bootstrap、ServerBootstrap三、Future 、ChannelFuture四、Channel五、Selector六、ChannelHandler 及其实现类七、Pipeline 和 ChannelPipeline八、ChannelHandlerContext九、ChannelOption十、EventLoopGroup 和其实现类十一、Unpooled类与ByteBuf…

Vue3技术5之watchEffect函数、Vue3生命周期、自定义hook函数

Vue3技术5 watchEffect函数Demo.vue总结 Vue3生命周期Vue3生命周期测试App.vueDemo.vue 组合式API使用生命周期钩子Demo.vue 总结&#xff1a; 自定义hook函数获取鼠标的x,yDemo.vue 使用hook方式文件目录hooks/usePoint.jsApp.vueDemo.vueTest.vue watchEffect函数 Demo.vue …

MicroPython ESP8266 GPIO引脚使用详解

MicroPython ESP8266 GPIO引脚使用 &#x1f4cc;相关篇《【MicroPython esp8266】固件烧写教程》 ✨本案例基于Thonny平台开发。✨ &#x1f4dc;固件版本信息&#xff1a;MicroPython v1.19.1 on 2022-06-18; ESP module with ESP8266 &#x1f516;ESP8266可用管脚有&…

计算机组成原理——第六章总线(上)

误逐世间乐&#xff0c;颇穷理乱情 文章目录 前言6.1.1 总线概述6.1.2 总线的性能指标6.2 总线仲裁(408不考) 前言 本章在概述部分我们会首先介绍一下总线的基本概念&#xff0c;介绍一下总线的分类以及经典结构&#xff0c;介绍一些性能指标来评价总线的性能如何&#xff0c;…

电子招标采购系统源码—企业战略布局下的采购

​ 智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#xff0…

通过单线程/线程池/分治算法三种方式实现1亿个数字的累加

一、任务类型 我们在做项目的时候&#xff0c;都需要考虑当前的项目或者某一个功能主要的核心是什么&#xff1f;是CPU密集计算型&#xff0c;还是IO密集型任务。我们调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源&#xff0c;从而最大限度地…

AIGC潮水中,重新理解低代码

如果将一句话生成应用形容成L4级的“无人驾驶”&#xff0c;伙伴云的「AI搭建」则更像L2级的“辅助驾驶”。 作者|斗斗 出品|产业家 2023年&#xff0c;AIGC下的低代码赛道“暗流涌动”。 “对于「AI搭建」的搭建效果&#xff0c;尤其是在场景覆盖的广度上&#xff0c;连…

正式开赛|2023年“桂林银行杯”数据建模大赛暨全国大学生数学建模竞赛广西赛区热身赛

为学习贯彻党的二十大工作报告中关于加快发展数字经济、促进数字经济和实体经济深度融合的重要指示&#xff0c;不断推进数字化转型与金融科技创新&#xff0c;桂林银行联合全国大学生数学建模竞赛广西赛区组委会、广西应用数学中心&#xff08;广西大学&#xff09;共同主办20…

如何选择CDN厂商

如果您的在线业务面临着流量和访客数量的增加&#xff0c;如果您想提高网站速度和用户体验&#xff0c;选择合适的CDN提供商是朝着正确方向迈出的一步&#xff0c;那么如何来选择最合适的CDN厂商呢&#xff0c;火伞云小编今天为您解答&#xff1a; 一、测试潜在的CDN提供商 对…

centos7.6非默认端口的ssh免密登录(centos7.6指定端口的ssh免密登录)

非默认端口号&#xff08;以6622端口号示例&#xff09;的免密登录 1.1. 修改/etc/ssh/sshd_config Port 6622 1.2. 重启sshd服务 service sshd restart 1.3. 创建用户ds(可选&#xff0c;这里以ds用户做免密为示例) adduser ds&#xff1b; 1.4. 查看ds用户(可选) id ds; …

HBase高手之路6—HBase高可用

文章目录 HBase的高可用一、HBase高可用简介二、搭建HBase的高可用1.在HBase的conf文件夹中创建一个backup-masters的文件2.修改backup-masters&#xff0c;添加作为备份master的节点信息3.分发backup-masters文件到其他的服务器4.重新启动HBase5.查看web ui 三、测试高可用1.尝…

辉煌优配|黄金价格创近两年半新高!2只黄金股一季度预增

黄金板块早盘走强。 4月14日早盘&#xff0c;黄金板块团体走高&#xff0c;次新股四川黄金开盘半小时内拉升至涨停&#xff0c;封单资金到达7279.78万元&#xff0c;中润资源、晓程科技涨幅居前&#xff0c;分别为8.96%、8.48% 消息面上来看&#xff0c;近期全球黄金期货价格节…

Matlab进阶绘图第17期—气泡热图

气泡热图是一种特殊的热图&#xff08;Heatmap&#xff09;。 与传统热图相比&#xff0c;气泡热图利用不同颜色、不同大小的圆形表示数据的大小&#xff0c;可以更加直观地对矩阵数据进行可视化表达。 本文使用自制的bubbleheatmap小工具进行气泡热图的绘制&#xff0c;先来…