设计模式——桥接模式

桥接模式(Bridge)

  在学习面向对象的过程中,可能会陷入一个误区,只要可以用,都用上继承,就好比因为有了新锤子,看什么东西都像是钉子了。
  事实上,继承可能会带来一些麻烦。比如对象的继承关系是在编译阶段就定义好的,所以无法在运行时改变从父类继承的实现。子类的实现与其父类有非常紧密的依赖关系,父类的变化必然导致子类的变化。当需要复用子类的时候,如果继承下来的实现不适用于解决新的问题,则父类必须重写或用更合适的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

合成(Composition)/聚合(Aggregation)复用原则(CARP)

  尽量使用合成/聚合,尽量不要使用类继承。

  这就是为什么说多用组合,少用继承。

  聚合表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但是B对象不是A对象的一部分;
合成也叫组合,是一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期是一样的。
大雁和翅膀是整体和部分的关系,生命周期一样,所以是组合关系。
大雁属于一个雁群,所以是聚合关系。

在这里插入图片描述

  合成/聚合复用原则的好处是:优先使用对象的合成/聚合有助于保持每个类被封装,并且集中在单个任务上。这样类和类继承层次会保持较小的规模,不容易发展成庞然大物。

桥接模式

  将抽象部分与它的实现部分分离,使他们都可以独立地变化

  例如手机既可以按照品牌分类,也可以按照功能分类。

在这里插入图片描述

  桥接模式的核心意图就是把这些实现独立出来,让他们各自变化,这样每种实现的变化都不会影响其他实现,从而达到应对变化的目的

在这里插入图片描述

#include <iostream>
#include <string>using namespace std;// 手机软件类
class HandsetSoft
{
public:virtual void Run() = 0;
};// 手机游戏
class HandsetGame : public HandsetSoft
{
public:void Run() override{cout << "运行手机游戏" << endl;}
};// 手机通讯录
class HandsetAddressList : public HandsetSoft
{
public:void Run() override{cout << "运行手机通讯录" << endl;}
};// 手机品牌类
class HandsetBrand
{
public:// 设置手机软件void SetHandsetSoft(HandsetSoft *soft){this->soft = soft;}// 运行手机软件virtual void Run() = 0;protected:HandsetSoft *soft;
};// 两个具体的品牌类
class HandsetBrandM : public HandsetBrand
{
public:void Run() override{soft->Run();}
};class HandsetBrandN : public HandsetBrand
{
public:void Run() override{soft->Run();}
};// 客户端代码
void Client()
{HandsetBrand *ab;ab = new HandsetBrandN();ab->SetHandsetSoft(new HandsetGame());ab->Run();ab->SetHandsetSoft(new HandsetAddressList());ab->Run();ab = new HandsetBrandM();ab->SetHandsetSoft(new HandsetGame());ab->Run();ab->SetHandsetSoft(new HandsetAddressList());ab->Run();
}int main()
{Client();return 0;
}

  这个过程就像是拿到一台新手机,给它装各种软件一样。
  实现手机品牌与手机软件的解耦,这样我们可以方便地增减手机品牌,也可以方便地增减手机的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ThreeJS-截屏下载pdf或者图片时白屏

JS-页面截图下载为pdf 关于如何下载为 pdf 在上面的这篇文章中有写&#xff0c;大家可以看下&#xff0c;下载图片代码在最下面 这时我们发现 three 部分是空白的如下&#xff1a; 这就多少有点尴尬了&#xff0c;这时我们习惯性的看下后台报错 是不是发现了惊喜&#xff0c;…

AI在肿瘤学临床决策中的应用:一种多模态方法

在临床肿瘤学领域&#xff0c;多模态人工智能&#xff08;AI&#xff09;系统通过解读各类医学数据&#xff0c;展现出提升临床决策的潜力。然而&#xff0c;这些模型在所有医学领域中的有效性尚未确定。本文介绍了一种新型的多模态医疗AI方法&#xff0c;该方法利用大型语言模…

突发!OpenAI停止不支持国家API,7月9日开始执行

6月25日凌晨&#xff0c;有部分开发者收到了OpenAI的信&#xff0c;“根据数据显示&#xff0c;你的组织有来自OpenAl目前不支持的地区的API流量。从7月9日起&#xff0c;将采取额外措施&#xff0c;停止来自不在OpenAI支持的国家、地区名单上的API使用。” 但这位网友表示&am…

WordPress如何删除前端评论中的网址字段?

前面跟大家分享的『WordPress插件Comment Link Remove and Other Comment Tools&#xff0c;删除评论网址字段』一文&#xff0c;通过安装插件可轻松删除前端评论中的网址字段&#xff0c;不过有些站长不喜欢安装插件&#xff0c;那么是否可以通过纯代码去掉网址字段呢&#xf…

Harbor本地仓库搭建004_Harbor配置管理功能_分布式分发功能_仓库管理_用户管理_垃圾清理_审查服务_项目定额---分布式云原生部署架构搭建00

然后我们再看一下配置管理,这里主要有个认证模式 这里我们是数据库,其实就是我们安装的postgresql 可以看到还有LDAP对吧,这个其实就是自己公司如果有 LDAP服务器,那么可以对接过来,那么,这个时候 再登录harbor的时候,就可以直接使用公司的,LDAP来管理,所有的用户了,其实就是…

Golang | Leetcode Golang题解之第173题二叉搜索树迭代器

题目&#xff1a; 题解&#xff1a; type BSTIterator struct {stack []*TreeNodecur *TreeNode }func Constructor(root *TreeNode) BSTIterator {return BSTIterator{cur: root} }func (it *BSTIterator) Next() int {for node : it.cur; node ! nil; node node.Left {it…

CLion2024 for Mac[po] C和C++的跨平台解代码编辑器

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

【Deep Learning】Self-Supervised Learning:自监督学习

自监督学习 本文基于清华大学《深度学习》第12节《Beyond Supervised Learning》的内容撰写&#xff0c;既是课堂笔记&#xff0c;亦是作者的一些理解。 在深度学习领域&#xff0c;传统的监督学习(Supervised Learning)的形式是给你输入 x x x和标签 y y y&#xff0c;你需要训…

Android开发系列(十)Jetpack Compose之Card

Card是一种常用的UI组件&#xff0c;用于显示一个具有卡片样式的容器。Card组件通常用于显示列表项、卡片式布局或任何需要显示边框和阴影的UI元素。 使用Card组件&#xff0c;您可以轻松地创建带有卡片效果的UI元素。以下是一些Card组件的常见属性和功能&#xff1a; elevati…

【机器学习】对大规模的文本数据进行多标签的分类处理

1. 引言 1.1. NLP研究的背景 随着人工智能技术的飞速发展&#xff0c;智能助手、聊天机器人和虚拟客服的需求正呈现出爆炸性增长。这些技术不仅为人们提供了极大的生活便利&#xff0c;如日程管理、信息查询和情感陪伴&#xff0c;还在工作场景中显著提高了效率。聊天机器人凭…

Kivy tutorial 004: Making the GUI do stuff, binding to events

Kivy tutorial 004: Making the GUI do stuff, binding to events – Kivy Blog Central themes: Events and Kivy properties 中心主题&#xff1a;事件和kivy属性 We left the last tutorial with a calculator app GUI with some nice automatic behaviour, but which doe…

【自然语言处理系列】探索NLP:使用Spacy进行分词、分句、词性标注和命名实体识别,并以《傲慢与偏见》与全球恐怖活动两个实例文本进行分析

本文深入探讨了scaPy库在文本分析和数据可视化方面的应用。首先&#xff0c;我们通过简单的文本处理任务&#xff0c;如分词和分句&#xff0c;来展示scaPy的基本功能。接着&#xff0c;我们利用scaPy的命名实体识别和词性标注功能&#xff0c;分析了Jane Austen的经典小说《傲…

vue3+ts:监听dom宽高变化函数

一、效果展示 二、代码 getSize.ts import { ref, Ref, watchEffect } from "vue";export const getWidth (domRef: Ref<HTMLElement | null>) > {const width ref<number>(0);const height ref<number>(0);const observer new ResizeObs…

google浏览器无法访问大端口的处理方式

属性的目标中添加后缀内容或者修改后台端口为常用端口&#xff0c;比如8080等。 “C:\Program Files\Google\Chrome\Application\chrome.exe” --explicitly-allowed-ports8888

Matlab基础语法:变量和数据类型,基本运算,矩阵和向量,常用函数,脚本文件

目录 一、变量和数据类型 二、基本运算 三、矩阵和向量 四、常用函数 五、脚本文件 六、总结 一、变量和数据类型 Matlab 支持多种数据类型&#xff0c;包括数值类型、字符类型和逻辑类型。掌握这些基本的变量和数据类型&#xff0c;是我们进行数学建模和计算的基础。 数…

【Linux基础IO】深入理解缓冲区

缓冲区在文件操作的过程中是比较重要的&#xff0c;理解缓冲区向文件刷新内容的原理可以更好的帮助我们更深层的理解操作系统内核对文件的操作。 FILE 因为IO相关函数与系统调用接口对应&#xff0c;并且库函数封装系统调用&#xff0c;所以本质上&#xff0c;访问文件都是通过…

强化学习专题:强化学习知识梳理(一)

2024/6/23&#xff1a; 前段时间有幸完成了大学期间的第一篇论文。在面试之前复盘一下关于自己论文中DQN的一些相关点。 浅谈主要区别&#xff08;在线 or 离线&#xff09; 首先&#xff0c;一切的开始是强化学习中时序差分方程&#xff0c;这体现了强化学习方法的优化策略。在…

LED热管理

LED照明系统的热管理 本文提供了用于LED灯具的热管理系统。 包含LED轨道灯具包括照明组件、安装到照明组件上并具有多个孔的夹具壳体&#xff0c;以及将夹具壳体固定到轨道上的安装结构。 照明组件包括具有多个翅片的散热器、安装在所述散热器上的反射器、支撑在所述散热器上…

怎么用Python接口发送推广短信

群发短信平台推广&#xff0c;有不少优点。其中通过正规106运营商平台推送&#xff0c;信息更加正规性。尤其是对接接口短信&#xff0c;比如验证码之类的&#xff0c;个人手机号码下发的验证码一般都不靠谱。 支持点对点一对一群发&#xff0c;方便工资条、物业通知等变量信息…