桥接模式详解

news2024/11/15 12:20:58

桥接模式

概念: 将抽象部分和实现部分分离, 使他们都可以独立的变化
概念很抽象, 难以理解, 我们举个例子
例子
设想三种不同品牌的汽车
大车
中车
小车
三种不同类型的引擎
纯电引擎
混动引擎
燃油引擎
如果我们把他们两两组合, 都继承同一个类的话,就会有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;
}

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

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

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

相关文章

vue的i18n国际化

一、介绍 i18n 是国际化和本地化&#xff08;Internationalization and Localization&#xff09;的缩写&#xff0c;其中 “i” 和 “n” 分别代表单词的首尾字母&#xff0c;而 “18” 代表中间的字母数。这个术语用于描述软件应用程序支持多种语言和地区设置的过程。 1、国…

调和级数详解

调和级数的来历 早在14世纪,尼克尔奥里斯姆已经证明调和级数发散,但知道的人不多。17世纪时,皮耶特罗曼戈里、约翰伯努利和雅各布伯努利完成了全部证明工作。 调和序列历来很受建筑师重视;这一点在巴洛克时期尤其明显。当时建筑师在建造教堂和宫殿时,运用调和序列为楼面…

怎样把经典CAD工具栏调出来

阅读更多cad如何显示工具栏&#xff1f;教你三个方法快速调出

ELFK基础搭建流程及在SpringBoot项目中进行日志采集的简单实践

目录 一、前言 二、ELK简介 三、ELK常见的几种架构 四、Docker安装ELFK的详细流程 4.1环境说明。 4.2ElasticSearch搭建 配置ElasticSearch 启动ElasticSearch 4.3Kibana搭建 配置kibana 启动kibana 4.4LogStash搭建 配置LogStash 启动LogStash 4.5Filebeat搭建 …

Elasticsearch之RestClient的简单操作(附java代码案例)

目录 前言 1. 案例Demo前期准备 1.1 sql数据 1.2 项目结构 1.3 mapping映射分析 1.4 初始化RestClient 2.索引库操作 2.1 创建索引库 2.1.1 代码解读 2.1.2 完整代码示例 2.2 判断索引库是否存在 2.3 删除索引库操作 2.4 索引库操作总结 3.RestClient操作文档 3.…

什么是逃逸分析

如何快速判断是否逃逸就看方法内new的对象实体是否能够被外部方法进行调用 什么是逃逸分析 在java虚拟机中&#xff0c;对象是在java堆中分配内存的&#xff0c;这是一个普遍的常识。但是&#xff0c;有一种特殊情况&#xff0c;那就是如果经过逃逸分析&#xff08;escape an…

nvidia系列教程-AGX-Orin can接口调试

目录 前言 一、AGX-Orin can介绍 二、原理图连接 三、系统配置 四、can数据收发 总结​​​​​​​ 前言 NVIDIA Jetson AGX Orin 是一款高性能的嵌入式平台,专为自动驾驶、机器人、物联网和其他需要大量计算能力和人工智能处理的应用设计。Jetson AGX Orin 集成了多个 …

【原创】java+swing+mysql客户信息管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片&#xff0c;希望和大家…

【xilinx】Versal Adaptive SoC DDRMC - NoC QoS 选项卡未出现

在 2024.1 之前的 Vivado 版本中&#xff0c;用户在使用 NoC 验证块设计时可以访问 NoC 对象窗口和 QoS 选项卡。 Vivado 2024.1 中存在一个已知问题&#xff0c;即 NoC 对象窗口和 QoS 选项卡不出现。 要显示 NoC 对象窗口和 QoS 选项卡&#xff0c;请保存块设计&#xff0c;…

【pwnable.kr】0x02-collision Writeup

题目描述 解法 拉取文件 scp -P2222 colpwnable.kr:col . scp -P2222 colpwnable.kr:col.c .分析源码 #include <stdio.h> #include <string.h>// hashcode值 unsigned long hashcode 0x21DD09EC;// 返回res&#xff0c;对main函数中传参进行“加密”变换操作 …

【特殊文件---properties】

properties 1. 注释 在properties中注释是采用#号开头的方式来进行注释的 2. 编写properties文件 在properties中&#xff0c;一行就是一个键值对&#xff08;keyvalue&#xff09;&#xff0c;简单的理解就是一行可以保存一个变量&#xff0c;键和值之间用号隔开 记住&…

使用Maple Flow进行工程计算与代码生成的图文教程

在工程和科学计算领域&#xff0c;Maple Flow以其强大的数学引擎和代码生成功能&#xff0c;成为工程师和研究人员的得力助手。本文将通过一系列步骤&#xff0c;引导您如何使用Maple Flow从概念验证到生成可在其他环境中运行的代码&#xff0c;完成一个完整的工作流程。 第一…

LLM大模型技术实战:一文讲透专补大模型短板的RAG

大型语言模型&#xff08;LLMs&#xff09;已经成为我们生活和工作的一部分&#xff0c;它们以惊人的多功能性和智能化改变了我们与信息的互动方式。但是当我们将大模型应用于实际业务场景时会发现&#xff0c;通用的基础大模型基本无法满足我们的实际业务需求&#xff0c;主要…

大模型时代,云南白药如何成为一家AI医药企业?|产业AI案例

作者|斗斗 编辑|皮爷 出品|产业家 中医药大模型发布&#xff1b;英伟达成立AI制药部门&#xff0c;发力生物制药领域&#xff1b;赛诺菲与百图生科达成战略合作&#xff0c;共同开发用于生物治疗药物发现的领先模型&#xff1b;京东发布医疗大模型&#xff1b;百度“产业级”…

机器学习--特征工程常用API

1. DictVectorizer - 字典特征提取 DictVectorizer 是一个用于将字典&#xff08;如Python中的字典对象&#xff09;转换为稀疏矩阵的工具&#xff0c;常用于处理类别型特征。 DictVectorizer(sparseTrue, sortTrue, dtype<class numpy.float64>)参数&#xff1a; spar…

ggplot阶截断坐标轴-gggap

目录 gggap包安装 功能查询 简单版使用代码 复杂版使用代码 gggap包安装 CRAN: Package gggap (-project.org) 手动下载安装 功能查询 > ?gggap > ?gggapDefine Segments in y-Axis for ggplot2 Description Easy-to-define segments in y-axis for ggplot2. …

使用Clion开发STM32串口调试遇到问题之重定向printf不显示(已解决问题)

为什么要使用重定向printf C语言中经常使用printf来输出调试信息&#xff0c;打印到屏幕。由于在单片机中没有屏幕&#xff0c;但是我们可以重定向printf&#xff0c;把数据打印到串口&#xff0c;从而在电脑端接收调试信息。这是除了debug外&#xff0c;另外一个非常有效的调…

根据前序遍历和中序遍历生成二叉树,并层序遍历输出二叉树

二叉树 前序遍历&#xff1a;ABDFCEGH 中序遍历&#xff1a;BFDAGEHC 演示 代码&#xff1a; package com.fdw.algorithm.hhh;import com.fdw.algorithm.structure.TreeNode;import java.util.LinkedList; import java.util.Queue;/*** description:* author: ThatMonth* cr…

Javaweb学习之JavaScript输出与字符串(二)

前情回顾 Javaweb学习之JavaScript&#xff08;一&#xff09;-CSDN博客 学习资源 w3school 在线教程 本期介绍 输出语句 在JavaScript中&#xff0c;有几种方式可以输出信息到控制台&#xff08;console&#xff09;、浏览器窗口&#xff08;window&#xff09;或其他地方。…

谷粒商城实战笔记-220~224-商城业务-微博认证服务-OAuth2.0

文章目录 一&#xff0c;220-商城业务-认证服务-OAuth2.0简介二&#xff0c;221-商城业务-认证服务-微博登录测试1&#xff0c;创建微博应用2&#xff0c;应用配置重定向url3&#xff0c;修改商城登录页面4&#xff0c;点击微博登录5&#xff0c;点击授权 三&#xff0c;222-商…