设计模式之-桥模式

squidpy 教程 2:利用 Scanpy 和 Squidpy 进行空间数据的可视化分析 本教程详细介绍了如何利用Squidpy和Scanpy对空间转录组数据进行可视化分析。通过将Scanpy处理得到的聚类结果映射回原始组织图像,并结合基因表达与空间邻域信息,帮助研究者直观揭示细胞类型分布、基因表达模式及空间相互作用,从而深入挖掘空间组学数据的生物学意义。 阅读详情

顾名思义,桥的作用就是将两条相互独立的路桥接到一起,而两条路可以保持各自的相对独立。在程序设计中,“桥”模式中的桥只是一种形象的比喻。根据桥模式的定义,桥模式实现了一个主题(可以是一个类,也可以是一中设计上的概念)的抽象部分和实现部分的分离(有的地方定义为抽象与具体行为的分离)。抽象部分的基类和实现部分的基类充就当着桥(接口对接)的作用,而抽象部分的子类和实现部分的子类就是桥两边的路,可以各自相对独立的发展(变化)(之所以是相对独立,从实现上来讲就是这种变化不能脱离最终能够实现桥接这个目标)。   

 我们知道,对于对象的研究,我们可以用这样的模型来表达对象:属性和行为。行为和属性都是对象的特征,其中属性描述对象的静态特征,而行为表达对象的动态特征,一般来讲,动态特征往往跟静态特征密切相关,相互影响,静态特征会约束动态特征的(行为),比如一个人如果是小孩(属性),那么他的行为很多都是受约束的,反过来,如果一个人经过吃(行为),又会长大,影响到身高,体重等(属性)。因为对象的特征都会发生变化,如果我们要表达这种变化,一是需要对这些对象根据我们的实际需要进行抽象,提取需要的特征,而对那些次要或者不需要的特征进行剔除。但这仅仅是研究对象的基础--抽象,我们还是需要表达重要特征的变化。

对于静态特征而言,变化的表达比较简单,只需要修改特征值即可,而且在实现上也比较容易,只要不同层次的对象都保持自己的特征值即可。但对于行为特征就不一样了,因为行为特征不仅受到静态特征这个约束,还会受到环境的影响。要用分类模式来表达所有静态特征和行为特征的变化是很困难的,我们只考察一种静态特征和一种行为特征的变化,这是最基本的一种情况,考虑到现有的技术体系,我们有两种方法来实现:

   A)利用类的单继承来实现(形成分类层次),比如人是抽象类,有个重要的特征性别,一个重要的行为跑,性别不同跑的行为当然也不一样,利用继承,我们可以派生出两个子类——男人和女人。这样行为跑也可以分为男人的跑和女人的跑,当然,如果仅仅是研究跑与性别的关系,问题是可以解决。但前面说了,行为除了受到静态特征的约束外,还会受到环境的影响,比如在不同产地的跑。这种情况下,如果还按照继承分类的方式去做,显然是不可取的,一是类体系太复杂,二是用环境来分类对象显然也不是一种可取的方式,因为环境是外在的。

   B)通过类的多继承来实现,对于多个特征的变化,这种方法可以减少类的数量,对于上述的例子,我们可以用一个对象的抽象和环境(比如产地)的抽象,人可以分为男人,女人,环境可以分为沙地,塑料跑道等。要描述男人在沙地跑,我们就从沙地和男人继承形成一个新的子类。这种方式看起来是可以,但有很多问题,一是不太符合对象分类原则(研究对象的分类一般都是根据对象本身,而不是会根据环境),在类体系上对象与环境天然就应该分离。二是从技术实现上来讲也比较麻烦,也违背了责任单一原则。

   那怎么来解决这种问题呢?我们来分析一下类的静态特征和动态特征,我们发现,对于静态特征的变化我们大多时候并不需要提供派生类来实现,只需要通过修改设置静态特征数据就可以了,只有那些对行为影响非常大,又属于我们主要研究范畴的静态特征,我们才需要按此属性进行派生,(比如,性别),而行为特征的变化,除了受到静态特征的影响外,还受到外界环境的影响,同时也会影响外界环境,比如人的跑这个行为在不同场地上跑是不一样的(比如沙地,水泥地),如果我们也采用继承的方式来实现这种变化,一是上面说的弊端,二从逻辑上我们也很难接受根据行为的环境来进行类派生的做法(虽然技术上是可以的),很难将一个跑在沙地和跑在水泥地人视为不同的类(人),但我们可以将场地进行抽象,将人在某个产地跑的行为委托给产地来实现,我们在人这个类中保持一个对场地的引用,而在跑的方法中除了实现自己必要的逻辑外,可以调用场地中的跑来具体实现跑的行为。因为双方各自可以采用继承的方式实现自己的变化,我们就可以在实际使用时临时指派具体场地。这样既减少了类的数量,又使得逻辑更加简单和灵活。下面是一个简单的例子类图:

从上面的例子我们可以看出,增加一个人的子类,或者增加一个产地,原来的结构都不需要动,符合设计的开闭原则。

总结如下:

A、桥模式实现了类中行为抽象与行为实现的分离,同时可以实现类本身和行为实现的各自发展。理论上对于任何特征都可以通过这种委托来实现抽象与实现的分离,但我觉得不推荐这种泛滥的应用,对于主要受静态特征影响而变化的行为我们可以通过继承来实现这种变化,只对受外在环境影响比较大的行为特征才使用这种模式来实现。

B.对于桥模式中抽象类保持一个对实现类的引用并不是必要的,对于上述例子,完全可以在通过Run的参数化来完成这种组合,这样人与产地的关系就可以从关联关系弱化到简单依赖。

C.桥模式提供了一种减少类的方法,为类沿着多维特征各自变化的情况提供了一种解决方法。

后记:桥模式可以实现系统在多个维度上的独立变化,这本身就要求系统在这些维度上的变化能够独立,如果这些维度相互之间存在着关联或者依赖,就会使得体系中关系过于复杂,相互之间的通信太多,甚至不能实现,比如人的行为跑,呼吸,说话,这几种行为相互影响有联系,就很难使用桥模式来实现,而在这种情况下就需要用建立数学模型的方式来进行。 

==========================================

以前写的,稍做修改。

Altium Designer(AD24/25)如何在PCB设计阶段做阻抗匹配 目前阻抗匹配多直接有制版厂进行,PCB设计师在设计阶段可不关注阻抗设计,在加工阶段只需标注需要控制的阻抗线,制板厂即可按照要求对阻抗线进行调整和控制。但是对于设计师来讲掌握阻抗线的设计方法也是非常必要的。本文介绍Altium Designer(AD24/25)如何在PCB设计阶段做阻抗匹配。 阅读详情

相关推荐

【亲测可用!】阿里达摩院开源实时数字人对话VideoChat本地部署教程(8G显存可跑)

本文主要记录在部署阿里达摩院开源实时数字人对话VideoChat时遇到的问题,希望对各位技术开发或爱好者有所帮助!

波点兔的博客 3897

桥模式-设计模式

动机 由于某些类型的固有的实现逻辑,使得他们具有两个变化的维度,乃至多个维度的变化。 如何应对这种“多维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度? 实例 场景:一个Message系统,系统中有一些公共方法,分别由PC和Mobile两个产品,同时每个产品又有精简版和完美版。 没有使用桥模式之前 没有稳定的framework供用户调用,代码没有做到开闭原则;同时代码重复率过高,不符合组合复用原则。 定义消息抽象类 public abstrac

抽象的螺旋 782

Oracle数据库的内存管理优化技巧

Oracle数据库作为企业级数据库管理系统,广泛应用于各种业务场景。内存管理是Oracle数据库性能优化的关键环节,合理的内存管理可以显著提高数据库的响应速度和吞吐量。本文的目的是深入探讨Oracle数据库内存管理的优化技巧,涵盖了系统全局区(SGA)和程序全局区(PGA)的管理、内存分配算法、内存参数调整等方面。通过详细的讲解和实际案例分析,帮助读者掌握优化Oracle数据库内存使用的方法,提高数据库的性能和稳定性。

2502_91592937的博客 996

桥模式(Bridge)

桥模式(Bridge) 动机 由于某些类型的固有实现逻辑,使得他们具有多个变化的维度。 待解决问题 如何应对多个维度的变化,如何应用面向对象技术使得类型可以轻松的沿着多个方向变化而不引入额外的复杂度。 桥模式定义 将抽象部分(业务功能)与实现部分(平台实现)分离,使得他们都可以独立的变化。 ————————GoF UML 图中imp指针做桥连接两个抽象类 例子:不同平台消息发送软件的不同版本 我们打算设计这样一个发消息的软件,该软件有PC端和移动端两种版本,同时PC和移动端该软件又同时具备精简版和完整版两

weixin_45730130的博客 1559

使用cubeMX生成USB HID设备

本文主要介绍如何使用stm32开发板和cubeMX生成HID设备,供参考。

专注音频,高效工作,快乐生活! 970

C#实战:5分钟搞定Modbus RTU通讯(基于NModbus4库)

本文详细介绍了如何使用C#和NModbus4库快速实现Modbus RTU通讯,包括环境配置、核心功能实现、性能优化及常见问题排查。通过代码示例和实用技巧,帮助开发者高效完成工业自动化设备的数据采集与控制任务。

weixin_30689307的博客 467

设计模式之桥模式(Bridge)

目录前言Bridge设计模式模式动机示例模式定义模式结构 前言 在学习侯捷老师的有关设计模式的课程(李建忠老师主讲)中,老师对23种设计模式的有自己的划分,如下。所以老师讲解是按照这种顺序讲解。 单一职责: Bridge设计模式 模式动机 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。 所以Bridge模式的动机就是应对“多维度的变化”。 看文字描述表枯燥,下面举几个例子: 商城系统中的电脑分类:如电脑类型+电脑品牌,这是两个维度的变化。 图形形状+颜色填充两种变化的

weixin_43744293的博客 2205

Fast-LIO2代码解析 古月居

FAST-LIO,FAST-LIO2与FASTER-LIO - 古月居FAST-LIO2代码解析(一) - 古月居FAST-LIO2代码解析(二) - 古月居FAST-LIO2代码解析(三) - 古月居FAST-LIO2代码解析(四) - 古月居FAST-LIO2代码解析(五) - 古月居FAST-LIO2代码解析(六) - 古月居

li4692625的博客 2786

WIFI无线路由器的五种工作模式

转自:http://www.360doc.com/content/12/0814/08/10560798_230064460.shtmlWIFI无线路由器已经非常普及其应用相当广泛,特别是现在家庭上网应用更是必不可少。现在而今眼目下哪家只有一台电脑,哪家又会为此去申请两条宽带?在这里给大家介绍五种WIFI无线路由器常用的工作方式,供各位在使用WIFI无线路由器时参考。1. 热点模式(Access ...

robinson_911的专栏 5498

java 对接工行聚富通H5聚合支付接口

java 对接工行聚富通H5聚合支付接口

lgl的博客 859

【OpenClaw从入门到精通】:Web控制台使用全解析——可视化配置与监控(2026实操版)

在OpenClaw的多种管理方式中,Web控制台提供了最直观、最友好的用户体验。通过图形化界面,用户可以轻松完成复杂的配置任务,实时监控系统状态,以及进行各种管理操作。对于不熟悉命令行的用户来说,Web控制台是最佳选择。

一键难忘的博客 1929

设计模式8-桥模式

将抽象部分也就是业务功能,与实现部分分离,使他们都可以独立的变化。public:Messager是一个抽象基类,定义了登录、发送消息、发送图片以及平台相关的功能(播放声音、绘制图形、写文本、连接)。这段代码通过将不同平台的实现和业务逻辑分开,展示了如何使用继承和多态来实现跨平台的消息传递系统。它遵循了开闭原则(对扩展开放,对修改关闭),使得添加新的平台或功能变得更容易。具体地,Messager定义了接口,和实现了平台相关的功能,而和实现了具体的业务逻辑。

qq_41810539的博客 1296

SAP_SD模块销售开票计划预收款系统配置及前台操作说明

在 SAP SD 中,开票计划(Billing Plan)是一种允许根据时间节点或里程碑对销售订单进行分期开票的功能。其中最常见的一种应用就是预收款(Down Payment Billing),即在销售订单中直接定义某个百分比或金额作为预收款,系统在开票时自动生成预收账单。大额合同或长期项目型销售(先收 20%,交货前收 30%,交货后收 50%)。分期付款模式(分阶段收款)。必须预收款才能安排生产或交货的业务。后台路径:SPRO—销售与分享—销售—销售凭证—销售凭证项目—定义项目类别。

我小时候很黑的博客 1409

设计模式:桥模式

桥模式 桥模式与修饰模式都是“单一职责”模式。 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 主要解决的问题: 在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。 将抽象部分与实现部分分离,使他们可以独立的变化。 下面来看一个多层继承的结构: 这种结构存在的...

月光骆驼的博客 414

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【设计模式】Head First 设计模式——桥模式 C++实现

设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。

Friday 1107

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

设计模式5-桥模式

桥模式也是单一职责模式的一种,设计的初衷是为了避免子类急剧膨胀,充斥重复代码. 动机 由于某些类型固有的实现逻辑,使得他们具有两个甚至多个变换的维度,如何应对这种多个维度的变化,如何利用面向对象的技术可以使得类型轻松地沿着两个甚至多个方向的变化,而不引入额外的复杂度. 实例 考虑一个messager通信模块类设计, ...

weixin_43822082的博客 153

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

设计模式-Bridge模式(桥模式)

图解设计模式一书中的桥模式

weixin_44030848的博客 1854

Java设计模式之桥模式

Java23种设计模式 桥模式用于抽象(abstraction)与实现(implementation)功能的解耦,使复杂的项目逻辑简单化,符合迪米特法则。 需求:小明主业是厨师,同时他也喜欢唱歌,但是我们不想把两个属性写到一起。 创建歌手接口,里面有唱歌的方法。 public interface Singer { void sing(); } 创建小明唱歌类,里面小明唱了一首我...

楊帥 194

设计模式(Python语言)----桥模式

桥模式内容 将一个事务的两个维度分离,使其都可以独立地变化 桥模式中的角色 抽象(Abstraction) 细化抽象(Refined Abstraction) 实现者(Implementor) 具体实现者(concrete Implementor) 桥模式的使用场景 当事务有两个维度上的表现,两个维度都有可能扩展时 桥模式的优点 抽象和实现相分离 优秀的扩展能力 桥模式实例 (1)未使用桥模式时,类设计如下,即形状和颜色两个维度都变化时,类的数量是很多的 class Shape: pas

redrose2100的博客 720

C++设计模式之桥模式

基类Messager分为两个类,一个是Messager类,一个是MessagerImp类,平台的选择通过多态指针messagerImp实现,在运行时被确定。从上述子问题拆分方式进行业务代码实现,我们实现了很多类,基类1个,平台实现类2个,业务抽象类2*2个。然而在实际业务中,你的平台实现和业务抽象类将会更多,假设n个实现平台,m个业务抽象方法,那将会有1+n+m*n个类,如下代码是我们没有学习过桥模式写出的代码,下面代码通过功能分解的方法将一个复杂功能伪代码实现。桥模式也是设计模式中单一组件模式的一种。

weixin_BESTWISHES0120的博客 760

设计模式之桥模式

设计模式之前只记录了一部分,然后最近在看李建总老师中的设计模式,发现讲解的非常好,于是补充下代码,与记录对应的类图,希望看过的同学,可以跑通代码,毕竟老师只是讲解具体过程。喜欢我博客的同学可以关注我,让我们共同进步,让自己的代码写的更加好。 视频链接:桥模式 “单一职责”模式: 在软件组件的设计中,如果责任划分的不清楚,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。 典型模式: Decorator Bridge 动机 由于某些类型的固有...

比卡丘不皮的博客 214

设计模式 (十一)桥模式(birdge)

简单的桥模式(birdge)将抽象与其实现解耦合,使他们的可以独立地变化,中文里把派生类叫做抽象的实现,而桥模式中所讲的实现恰恰不是这个意思,桥模式中的抽象类及派生类,实现指的是这些抽象类及派生类实现自己的方式。 简单的桥模式(birdge)的原理图 下面是关于这个模式的简单的一个例子程序,有一个鼠标抽象类,其这个鼠标分别属于联想和宏基生产的,这样用桥模式通过组合和继承,简

一只独孤的程序猿 3393

java-设计模式之桥模式

yxlr_beta的博客 274

设计模式-桥模式

桥模式 当事物有两个维度,两个维度都有扩展 有些系统耦合度特别高,需要一定程度解耦合 举例耦合度高 #绘制图形 图形由颜色和形状组成 class shape(object): pass #图形 class circle(shape): pass class line(shape): pass class redcirle(object): pass class blackcricle(object): pass #..... #颜色和图形耦合在一起,假如要加一

nihuhui666的博客 534

[设计模式] —— Bridge 桥模式

文章目录桥模式动机定义示例代码结构图总结 桥模式 软件组件的设计中,如果责任划分的不清晰,使继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码。 动机 由于某些固定的固有实现逻辑,使得它们具有两个变化的维度,乃至多个维度的变化。 如何应对”多维度的变化“?如何利用面对对象关系技术来使得类型可以轻松沿着两个乃至更多的方向变化而不引入额外的复杂度。 定义 将抽象部分(业务功能)与实现部分(平台实现)分离,是它们都可以独立变化。 示例代码 class Messager { public: //

Chris_zhangrx的博客 551

设计模式五 桥模式(Bridge)

1.桥模式 1.1 桥模式是单一职责模式的一种 1.1.1 单一职责模式 在软件组织的设计中,如果责任划分的不清晰,是的继承得到的结果往往是随着需求的变化, 子类急剧膨胀,同时充斥着重复代码,这个时候的关键是划清职责. 1.1.2 典型的单一职责模式 Decorator Bridge 1.1.3 单一职责模式的动机 某些情况下我们可能会过度地使用继承来扩展对象的功能,由于继承为类型引入的静态特质,是的 这种扩展方式缺乏灵活性,并且随着子类的增多(扩展功能的增多),各种子类的组合(功能扩展的 组

Edidaughter的博客 550
上一篇: 学无止境,温故而知新
下一篇: 设计模式之-策略模式
广州接入
广州接入 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄24年 2224粉丝 731原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值