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

桥接模式详解

桥接模式

概念: 将抽象部分和实现部分分离, 使他们都可以独立的变化
概念很抽象, 难以理解, 我们举个例子
例子
设想三种不同品牌的汽车
大车
中车
小车
三种不同类型的引擎
纯电引擎
混动引擎
燃油引擎
如果我们把他们两两组合, 都继承同一个类的话,就会有9个类, 并且如果后续继续扩展车的类型或者引擎的话, 那类的数量就爆炸了, 如下图所示

class Car
class ElectricalBigCar : Car
class ElectricalMiddleCar : Car
class ElectricalSmallCar : Car

所以我们不要过度使用继承, 可以优先考虑拆分, 我们将引擎类单独拆分出来, 然后Car类包含引擎类, 这样就会大大减少类的数量
代码

class Engine
{
public:virtual void start() = 0;
};class ElectricalEngine : public Engine
{
public:void start() override{cout << "electrical engine start" << endl;}
};class HybridEngine : public Engine
{
public:void start() override{cout << "hybrid engine start" << endl;}
};class FuelEngine : public Engine
{
public:void start() override{cout << "fuel engine start" << endl;}
};class Car
{
private:Engine* e;
public:Car(Engine* _e) : e(_e) {};virtual void start() = 0;void run(){e->start();start();}
};class SmallCar : public Car
{
public:SmallCar(Engine* e) : Car(e) {};void start(){cout << "small car start" << endl;}
};class MiddleCar : public Car
{
public:MiddleCar(Engine* e) : Car(e) {};void start(){cout << "middle car start" << endl;}
};class BigCar : public Car
{
public:BigCar(Engine* e) : Car(e) {};void start(){cout << "big car start" << endl;}
};int main()
{BigCar* bc = new BigCar(new FuelEngine());bc->run();return 0;
}

执行结果
在这里插入图片描述
设计思想
桥接模式的设计思想就是, 不要过度使用继承,而是优先拆分某些部件,使用组合的方式来扩展功能。

相关文章:

桥接模式详解

桥接模式 概念: 将抽象部分和实现部分分离, 使他们都可以独立的变化 概念很抽象, 难以理解, 我们举个例子 例子 设想三种不同品牌的汽车 大车 中车 小车 三种不同类型的引擎 纯电引擎 混动引擎 燃油引擎 如果我们把他们两两组合, 都继承同一个类的话,就会有9个类, 并且如果后…...

使用一致性哈希解决哈希分片负载均衡的扩展性问题

声明&#xff1a;本文的图全部源于&#xff1a;小林coding 上来咱先说&#xff0c;一致性哈希是应对分布式系统的算法 假设有一个负载均衡问题&#xff0c;也就是大批流量来请求&#xff0c;那怎么分配这些流量&#xff1f; 随机&#xff1f;还是挨个轮询&#xff1f; 这都…...

探索 Resolume Arena 7 - 引领 VJ 音视频创作的卓越软件

Resolume Arena 7 是一款专为 Mac 和 Windows 系统设计的强大 VJ 音视频软件&#xff0c;为创意专业人士和爱好者提供了丰富而出色的功能。 这款软件拥有直观且用户友好的界面&#xff0c;即使对于初学者来说&#xff0c;也能快速上手并开始创作。其强大的媒体管理功能&#x…...

三勾点餐系统|支持多端发布,方便二次开发

版本号1.7更新日志 新增&#xff1a;腾讯地图key设置&#xff08;更新后请设置key&#xff09; 新增&#xff1a;支付宝小程序登录和支付 新增&#xff1a;前端点餐时选择门店 新增&#xff1a;前端点餐页面优惠活动显示 新增&#xff1a;H5修改手机号 新增&#xff1a;H…...

深入理解AES加密算法:原理与Python实现

目录 深入理解AES加密算法&#xff1a;原理与Python实现1. AES算法简介2. AES加密解密流程3. Python实现AES加密解密4. 结论 深入理解AES加密算法&#xff1a;原理与Python实现 AES (Advanced Encryption Standard) 是目前最广泛使用的对称加密算法之一。它具有高效、安全和灵…...

Redis中List数据类型常用命令

目录 1. 基本操作 &#xff08;1&#xff09;在列表的头部插入一个元素 &#xff08;2&#xff09;在列表的尾部插入一个元素 &#xff08;3&#xff09;获取列表的长度 &#xff08;4&#xff09;获取列表中的元素 2. 读取和修改 &#xff08;1&#xff09;获取列表的范围&…...

借助Aapose.Cells 使用 C# 在 Excel 中读取、添加和编辑线程注释

Excel 中的线程注释是协作工作的重要功能。它允许多个用户在共享文档中添加、编辑和查看对话线程。在某些情况下&#xff0c;我们可能需要以编程方式管理这些线程注释。在这篇博文中&#xff0c;我们将学习如何使用 C# 在 Excel 中读取、添加和编辑线程注释。 Aspose.Cells 是…...

关于c++ grpc 和 c# grpc 通信的问题 以及 grpc 认证问题

一、c 和 c# 通信 c# 端服务器 如果域名 输入的是 https &#xff0c;则 c 端需要匹配使用&#xff0c;也就是c 端需要进行安全认证。如果是http 则c 端不需要认证&#xff08;基于c#的grpc 未 通信成功&#xff09; 参考如下网址可以写一个简单的 .net grpc服务器 &#xff08…...

C++进阶(14)类型转换、IO流

文章目录 一、类型转换C语言隐式类型转换强制类型转换 C类型转换的情况类型转换的函数&#xff08;4个&#xff09; 二、IO流1、缓冲区2、提高输入输出效率3、文件操作文件权限写操作 --- ofstream文本方式写入二进制方式写入 读操作 --- ifstream文本方式读取二进制方式读取 其…...

配置oss cdn加速静态资源访问 阿里云

效果对比 配置cdn下载速度对比 步骤 1: 登录阿里云控制台控制台主页&#xff0c;找到并点击“对象存储 OSS” 创建存储空间&#xff08;Bucket&#xff09; 设置权限 步骤 2: 获取外网访问地址 步骤 3 在 CDN 中使用该地址 复制该外网访问地址 打开全站加速 DCDN/域名管理 添…...

实现 前端框架 SPA 路由功能:Hash 模式与 History 模式的手动实现

前言 在前端框架&#xff08;如 Vue.js、React 等&#xff09;中&#xff0c;路由管理通常会配置一个 router 对象来定义 URL 路径与组件的映射关系。 路径&#xff08;path&#xff09;: 这是浏览器 URL 的一部分&#xff0c;比如 /home 或 /about。组件&#xff08;compone…...

去中心化的新时代:Web3技术的全球影响

随着技术的不断演进&#xff0c;Web3正引领互联网的去中心化新时代。相较于传统的Web1和Web2&#xff0c;Web3通过去中心化、区块链和智能合约等技术&#xff0c;正在重塑网络的运作方式。这一变革不仅提升了网络的安全性和透明度&#xff0c;也对全球经济、社会和文化产生了深…...

初始redis:List

列表 List 相当于数组或者顺序表。 对于List来说&#xff0c;两侧都可以插入和删除&#xff0c;时间复杂度是O(1)。 有很多的操作&#xff0c;比如 llen 可以获取List的长度&#xff0c;lrem 可以删除元素 &#xff0c;lrange可以去一个字符串 &#xff0c; lindex可以根据下标…...

Java | Leetcode Java题解之第355题设计推特

题目&#xff1a; 题解&#xff1a; class Twitter {private class Node {// 哈希表存储关注人的 IdSet<Integer> followee;// 用链表存储 tweetIdLinkedList<Integer> tweet;Node() {followee new HashSet<Integer>();tweet new LinkedList<Integer&g…...

MVC与三层架构分层

1. 应用分层 应用分层类似公司的组织架构。我们进行项目开发时&#xff0c;最开始功能简单&#xff0c;前后端放在一起开发&#xff0c;但随着项目功能的复杂&#xff0c;项目会被前端和后端不同的团队接手&#xff0c;甚至更细粒度的团队。甚至后端开发也会根据功能再进行细分…...

Go语言基础--switch

在Go语言中&#xff0c;switch语句是一种非常强大的控制流结构&#xff0c;它允许一个变量的值与多个case进行比较&#xff0c;并根据匹配的结果执行不同的代码块。与C、C或Java中的switch不同&#xff0c;Go语言的switch更灵活&#xff0c;支持没有显式条件的switch&#xff0…...

【数字ic自整资料】AXI握手协议及outstanding

参考资料&#xff1a; ic基础|时序篇&#xff1a;握手协议valid和ready的时序优化_valid和ready握手信号-CSDN博客 https://zhuanlan.zhihu.com/p/365573848 1、AXI握手协议 当我们遇到时序违例时&#xff0c;通常采用的方式为插入寄存器&#xff08;打拍&#xff09;或者是…...

C++ //练习 18.13 什么时候应该使用未命名的命名空间?

C Primer&#xff08;第5版&#xff09; 练习 18.13 练习 18.13 什么时候应该使用未命名的命名空间&#xff1f; 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 解释 当需要将实体限定在特定文件中&#xff0c;并且不会作用于不同文件…...

yum小bug

这个错误是在克隆的机子上安装mysql时&#xff0c;查看有无mysql发现的 [rootwebserve-2 backup] # yum list installed | grep mysql Repository cr is listed more than once in the configuration Repository fasttrack is listed more than once in the configuration 这…...

GDB的基本使用

我有话说 因为时间和精力原因&#xff0c;本文写的虎头蛇尾了&#xff0c;除了启动调试与程序执行以外只有少量截图演示&#xff0c;只是简单的说明。如果有需要可以联系我&#xff0c;我有时间的话会把演示补上&#xff0c;谢谢理解。 启动调试与程序执行 启动调试并传递参数…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...