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

篇七:桥接模式:连接抽象和实现

篇七:“桥接模式:连接抽象和实现”

开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。

另外有2本不错的关于设计模式的资料,分享出来与大家学习参考。
链接:https://pan.baidu.com/s/1RmhQF_o1CdK8U7s5KeILog?pwd=xc6d
提取码:xc6d

设计模式是软件开发中的重要组成部分,桥接模式是结构型设计模式中的一种。桥接模式旨在将抽象与其实现相分离,使它们可以独立地变化。通过桥接模式,我们可以连接抽象和实现,从而使得系统更加灵活和可扩展。在C++中,桥接模式广泛应用于处理抽象与实现分离的场景,让我们一起介绍其原理和优势,并提供C++实现桥接模式的示例代码。

1. 桥接模式的原理和优势:
桥接模式是结构型设计模式,其原理在于将抽象与其实现相分离,使它们可以独立地变化,从而避免了抽象类与实现类之间的紧耦合关系。桥接模式使用了桥接(Bridge)接口来连接抽象和实现,从而实现了它们的解耦。

桥接模式的优势包括:

  • 分离抽象和实现:桥接模式将抽象与实现相分离,使得它们可以独立地变化,增加了系统的灵活性和可扩展性。
  • 提高代码可维护性:由于抽象与实现分离,系统更易于理解和维护,修改抽象类不会影响实现类,反之亦然。
  • 支持新增功能:通过增加新的抽象类和实现类,可以轻松地添加新的功能组合。

2. C++中实现桥接模式的示例代码:

a. 定义桥接接口:

// DrawingAPI.h
class DrawingAPI {
public:virtual ~DrawingAPI() {}virtual void drawCircle(double x, double y, double radius) const = 0;
};

b. 创建具体桥接实现类:

// DrawingAPI1.h
#include <iostream>
#include "DrawingAPI.h"class DrawingAPI1 : public DrawingAPI {
public:void drawCircle(double x, double y, double radius) const override {std::cout << "API1.circle at " << x << ":" << y << " radius " << radius << std::endl;}
};// DrawingAPI2.h
#include <iostream>
#include "DrawingAPI.h"class DrawingAPI2 : public DrawingAPI {
public:void drawCircle(double x, double y, double radius) const override {std::cout << "API2.circle at " << x << ":" << y << " radius " << radius << std::endl;}
};

c. 创建抽象类:

// Shape.h
#include "DrawingAPI.h"class Shape {
public:Shape(DrawingAPI* drawingAPI) : drawingAPI_(drawingAPI) {}virtual ~Shape() {}virtual void draw() const = 0;protected:DrawingAPI* drawingAPI_;
};

d. 创建具体抽象类:

// Circle.h
#include "Shape.h"class Circle : public Shape {
public:Circle(double x, double y, double radius, DrawingAPI* drawingAPI): Shape(drawingAPI), x_(x), y_(y), radius_(radius) {}void draw() const override {drawingAPI_->drawCircle(x_, y_, radius_);}private:double x_;double y_;double radius_;
};

e. 使用桥接模式:

// main.cpp
#include "Circle.h"
#include "DrawingAPI1.h"
#include "DrawingAPI2.h"int main() {Circle circle1(1, 2, 3, new DrawingAPI1());Circle circle2(4, 5, 6, new DrawingAPI2());circle1.draw();circle2.draw();return 0;
}

在上述示例中,我们定义了桥接接口DrawingAPI,并创建了具体的桥接实现类DrawingAPI1DrawingAPI2。然后,我们定义了抽象类Shape,其中包含一个对原理:其中包含一个对DrawingAPI的引用,以及纯虚函数draw()。接着,我们创建了具体的抽象类Circle,继承自Shape,并在构造函数中传入具体的DrawingAPI实现类。在draw()方法中,我们调用了DrawingAPIdrawCircle()方法,从而连接了抽象和实现。

main.cpp中,我们创建了两个Circle对象,分别使用不同的DrawingAPI实现类进行绘制。由于CircleDrawingAPI之间通过桥接接口连接,它们的关系是松耦合的,因此可以轻松地切换和组合不同的实现类。

3. 桥接模式的代码解析:

  • 桥接模式通过桥接接口将抽象和实现相分离,实现了抽象与实现之间的解耦。这使得系统更加灵活和可扩展,提高了代码的可维护性和可复用性。
  • 抽象类通过桥接接口与具体的实现类关联,并在抽象方法中调用实现类的方法,从而将抽象和实现连接在一起。
  • 客户端可以使用不同的实现类来创建不同的抽象类对象,从而实现不同的功能组合。

4. 总结:
桥接模式是结构型设计模式,其作用在于将抽象与实现相分离,实现了抽象与实现之间的解耦。在C++中,通过定义桥接接口和具体实现类,以及抽象类和具体抽象类,实现了桥接模式的应用。桥接模式使得系统更加灵活和可扩展,提高了代码的可维护性和可复用性。

希望本文能够帮助您更好地理解桥接模式的原理和优势,并通过C++的示例代码帮助您更好地应用桥接模式。在后续的专栏文章中,我们将继续介绍更多设计模式的知识,包括原理、详细介绍、示例代码和代码解析,帮助您深入学习和应用设计模式。

参考文献:

  • Gamma, E., Helm, R., Johnson, R., & Vlissides, J. (1994). Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley Professional.
  • C++ Core Guidelines: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines

感谢您的阅读,欢迎一起探讨,共同进步,推荐大家使用学习助手AIRight来解答学习过程中的问题,访问链接:http://airight.fun/

相关文章:

篇七:桥接模式:连接抽象和实现

篇七&#xff1a;“桥接模式&#xff1a;连接抽象和实现” 开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 另外有2本不错的关于设计模式的资料&#xff0c…...

STL容器适配器 -- stack和queue(使用+实现)(C++)

stack和queue stackstack的介绍stack的使用stack的实现 queuequeue的介绍queue的使用queue的实现 deque简单介绍deque&#xff08;双端队列&#xff09;双开口连续打引号的原因 deque底层结构deque的迭代器封装结构&#xff08;复杂&#xff09;deque的优缺点 栈和队列数据结构…...

K8s operator从0到1实战

Operator基础知识 Kubernetes Operator是一种用于管理和扩展Kubernetes应用程序的模式和工具。它们是一种自定义的Kubernetes控制器&#xff0c;可以根据特定的应用程序需求和业务逻辑扩展Kubernetes功能。 Kubernetes Operator基于Kubernetes的控制器模式&#xff0c;通过自…...

【LangChain学习】基于PDF文档构建问答知识库(三)实战整合 LangChain、OpenAI、FAISS等

接下来&#xff0c;我们开始在web框架上整合 LangChain、OpenAI、FAISS等。 一、PDF库 因为项目是基于PDF文档的&#xff0c;所以需要一些操作PDF的库&#xff0c;我们这边使用的是PyPDF2 from PyPDF2 import PdfReader# 获取pdf文件内容 def get_pdf_text(pdf):text "…...

阿里云国际站对象储存OSS的常见问题?

1.什么是阿里云OSS&#xff1f; 阿里云对象存储服务OSS&#xff08;Object Storage Service&#xff09;&#xff0c;是阿里云提供的海量、安全、低成本、高持久性的云存储服务&#xff0c;并可无限扩展。其数据设计持久性不低于99.9999999999%&#xff08;12个9&#xff09;&a…...

spss什么是描述性分析,以及如何去处理。

描述性分析是数据分析的第一步&#xff0c;是了解和认识数据基本特征和结构的方法&#xff0c;只有在完成了描述性统计分析&#xff0c;充分的了解和认识数据特征后&#xff0c;才能更好地开展后续更复杂的数据分析。因此&#xff0c;描述性分析是开展数据分析过程中最基础且必…...

OSCS 闭门研讨第一期实录:软件供应链安全建设价值

2023 年 7 月 18 日晚 19:30&#xff0c;软件供应链安全技术交流群&#xff08;OSCS&#xff09;组织了第一次线上的闭门研讨会&#xff0c;本次研讨会我们收到 71 个来自各个企业关注软件供应链安全的技术专家的报名&#xff0c;根据研讨会参与规则要求&#xff0c;我们对报名…...

STM32入门——ADC模数转换

ADC简介 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量&#xff0c;建立模拟电路到数字电路的桥梁12位逐次逼近型ADC&#xff0c;1us转换时间输入电压范围&#xff1a;0~3.3V&#xff0c;…...

【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(下)

内容简介 在项目开发中&#xff0c;除了考虑正常的调用之外&#xff0c;负载均衡和故障转移也是关注的重点&#xff0c;这也是feign ribbon的优势所在&#xff0c;基于上面两篇文章的基础&#xff0c;接下来我们开展最后一篇原生态fegin结合ribbon服务进行服务远程调用且实现负…...

【leetcode】454. 四数相加 II(medium)

给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 思路&#xff1a;如果要暴力&#xff0c;那么时间复杂…...

PHP先等比缩放再无损裁剪图片【实例源码】

很多人在使用程序裁剪图片时,是在原图上直接裁剪,这样的裁剪结果是使得图片变得不完整了,理想的做法是先等比缩小图片,再把多余的部分裁掉,这样会保留更多的图片信息。 实现代码: <?php/*** 说明:函数功能是把一个图像裁剪为任意大小的图像,图像不变形** @param …...

共享广告主项目:广告也能共享?全民广告时代来袭

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 广告是我们日常生活中在衣食住行中可以看到的一种宣传方式。广告作为互联网社会的信息传播方…...

Flink-间隔联结

间隔联结只支持事件时间间隔联结如果遇到迟到数据&#xff0c;则会关联不上&#xff0c;比如来了一个5秒的数据&#xff0c;它可以关联前2秒的数据&#xff0c;后3秒的数据&#xff0c;就是可以关联3秒到8秒的数据&#xff0c;然后又来了一个6秒的数据&#xff0c;可以关联4秒到…...

redis的持久化

第一章、redis的持久化 1.1&#xff09;持久化概述 ①持久化可以理解为将数据存储到一个不会丢失的地方&#xff0c;Redis 的数据存储在内存中&#xff0c;电脑关闭数据就会丢失&#xff0c;所以放在内存中的数据不是持久化的&#xff0c;而放在磁盘就算是一种持久化。 ②为…...

藏语翻译器:多功能翻译软件

这是是一款能够将藏语翻译成其他语言或将其他语言翻译成藏语的软件。该软件能够识别并翻译藏语中的常用词汇和短语&#xff0c;并且支持多种常见语言的翻译&#xff0c;例如英语、汉语、法语、德语等等。此外&#xff0c;藏语翻译器还具有简单易用的用户界面&#xff0c;方便用…...

Java课题笔记~ JavaWeb概述/开发基础

JavaWeb概述/开发基础 1.XML基础 &#xff08;1&#xff09;XML概述 &#xff08;2&#xff09;XML语法 &#xff08;3&#xff09;DTD约束 &#xff08;4&#xff09;Schema约束&#xff08;XML Schema 比 DTD 更强大&#xff09; 2.Web基础知识 Web是一个分布式的超媒…...

【解放ipad生产力】如何在平板上使用免费IDE工具完成项目开发

我的博客即将同步至腾讯云开发者社区&#xff0c;邀请大家一同入驻&#xff1a;https://cloud.tencent.com/developer/support-plan?invite_code3o19zyy2pneoo 前言 很多人应该会像我一样吧&#xff0c;有时候身边没电脑突然要写项目&#xff0c;发现自己的平板没有一点作用&…...

IDEA快捷键总结

切换窗口 Alt&#xff08;1-9&#xff09; Alt1 打开或者关闭左侧project Alt4 Run窗口 Alt5 Debug窗口 Alt7 类结构窗口 生成构造函数、get、set等方法 Altinsert 快速生成输出语句 Soutenter键 运行程序 chtlshiftf10 运行程序 shiftf9 debug方式运行程序 代码…...

OpenJDK Maven 编译出错: package jdk.nashorn.internal.runtime.logging does not exist

前言 OpenJDK 1.8.0Maven 3.8.5TencentOS Server 3.1 错误信息 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project tour-common: Compilation failure: Compilation failure: [ERROR] /opt/tour-c…...

.Net Framework请求外部Api

要在.NET Framework 4.5中进行外部API的POST请求&#xff0c;你可以使用HttpClient类。 1. Post请求 using System; using System.Net.Http; using System.Threading.Tasks;class Program {static async Task Main(string[] args){// 创建一个HttpClient实例using (HttpClien…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...

MeshGPT 笔记

[2311.15475] MeshGPT: Generating Triangle Meshes with Decoder-Only Transformers https://library.scholarcy.com/try 真正意义上的AI生成三维模型MESHGPT来袭&#xff01;_哔哩哔哩_bilibili GitHub - lucidrains/meshgpt-pytorch: Implementation of MeshGPT, SOTA Me…...