桥接模式

设计模式的征途—8.桥接(Bridge)模式

醉酒当歌 提交于 2020-03-12 06:19:44
在现实生活中,我们常常会用到两种或多种类型的笔,比如毛笔和蜡笔。假设我们需要大、中、小三种类型的画笔来绘制12中不同的颜色,如果我们使用蜡笔,需要准备3*12=36支。但如果使用毛笔的话,只需要提供3种型号的毛笔,外加12个颜料盒即可,涉及的对象个数仅为3+12=15,远远小于36却能实现与36支蜡笔同样的功能。如果需要新增一种画笔,并且同样需要12种颜色,那么蜡笔需要增加12支,而毛笔却只需要新增1支。通过分析,在蜡笔中,颜色和型号两个不同的变化维度耦合在一起,无论对其中任何一个维度进行扩展,都势必会影响另外一个维度。但在毛笔中,颜色和型号实现了分离,增加新的颜色或者型号都对另外一方没有任何影响。在软件系统中,有些类型由于自身的逻辑,它具有两个或多个维度的变化。为了解决这种多维度变化,又不引入复杂度,这就要使用今天介绍的Bridge桥接模式。 桥接模式(Bridge) 学习难度:★★★☆☆ 使用频率:★★★☆☆ 一、跨平台的图像浏览系统 1.1 需求介绍 M公司开发部想要开发一个跨平台的图像浏览系统,要求该系统能够显示JPG、BMP、GIF、PNG等多种格式的文件,并且能够在Windows、Linux以及Unix等多个操作系统上运行。该系统首先将各种格式的文件解析为像素矩阵(Matrix),然后将像素矩阵显示在屏幕上,在不同的操作系统中可以调用不同的绘制函数来绘制像素矩阵

设计模式之桥接模式

余生长醉 提交于 2020-03-06 00:10:24
定义: 将抽象与实现解耦,使得俩者可以独立的变化。这种模式将抽象部分与实现部分联系起来,就像是一座桥,将桥的两岸连接,构成一个整体。桥接模式是一种行为型设计模式。 桥接模式的4个模型角色: 抽象化角色模型: 抽象角色,持有实现化角色引用; 具体抽象化模型: 继承至抽象化角色,实现抽象化角色定义的方法逻辑并扩展自己本身的特性; 实现化角色模型: 通常声明为接口,提供对应的逻辑方法; 具体实现化角色模型: 对实现化角色中的逻辑方法提供具体的实现; 使用桥接模式实现一个简单案例。 场景:花园有很多不同种类,不同颜色的花,现在要了解花的颜色与种类。 分析:对于最顶层花的描述肯定是要抽象的,具体什么花通过继承可以实现,那么颜色这个描述就是实现化模型了。 代码示例: //抽象化模型 - 花 public abstract class Flower { private Color color ; public Flower ( Color color ) { this . color = color ; } public abstract String getFlower ( ) ; /** * 声明一个公共部分的方法 * @return */ public void show ( ) { Log . d ( "TAG" , "一朵" + color . getColor ( ) + "的" +

C#:桥接模式

邮差的信 提交于 2020-03-03 18:18:50
转自原文 C#: 桥接模式 1.引言 桥接模式是一种很实用的结构型设计模式,如果系统中的某各类存在两个独立变化的纬度,通过桥接模式可以将这两个纬度分离出来,它是将抽象部分和实现部分解耦,使得两者都能够独立变化。如果不理解,怎么说都会觉得晦涩,看下面的两个例子: (1)示例1【 桥接模式 】 把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视品牌的遥控器都继承这个抽象类,具体设计类图如下: 这样的实现使得每部不同型号的电视都有自己遥控器实现,这样的设计对于电视机的改变可以很好地应对,只需要添加一个派生类就搞定了,但随着时间的推移,用户需要改变遥控器的功能,如:用户可能后面需要对遥控器添加返回上一个台等功能时,此时上面的设计就需要修改抽象类RemoteControl的提供的接口了,此时可能只需要向抽象类中添加一个方法就可以解决了,但是这样带来的问题是我们改变了抽象的实现,如果用户需要同时改变电视机品型号和遥控器功能时,上面的设计就会导致相当大的修改,显然这样的设计并不是好的设计。 (2)示例2 画笔有毛笔和蜡笔两种,假如需要大、中、小3种型号的画笔,能够分别绘制出12种不同的颜色,如果使用蜡笔的话需要准备36支,如果使用毛笔,则只需要准备3种型号的毛笔外加12种颜色的调色板,总共15样。如果需要新增一种新型号的画笔,对于蜡笔来说需要增加12支

9.桥接模式

Deadly 提交于 2020-03-01 07:01:08
手机操作问题 手机有不同的样式和品牌,每一种样式下面有各种品牌,每一种品牌也有多种样式,当然随时可能增加或者减少某一种样式或者某一种品牌的手机,需要考虑ocp原则,设计方案时; 传统方案 解决手机使用问题(类图): 传统方案解决手机操作问题 扩展性问题 (类爆炸),如果我们再增加手机的样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要在各个手机样式类下增加。 违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本. 解决方案- 使用桥接模式 桥接模式(Bridge) 基本介绍 桥接模式(Bridge模式)是指:将 实现 与 抽象 放在两个不同的类层次中,使两个层次 可以独立改变 。 抽象聚合了实现 是一种 结构型设计模式 Bridge模式基于 类的最小设计原则 ,通过使用封装、聚合及继承等行为让不同 的类承担不同的职责。它的主要特点是把 抽象(Abstraction) 与 行为实现 ( Implementation )分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展, 对于哪个是抽象,哪个是实现是自己需要分辨的 ; 原理类图 桥接模式解决手机操作问题 这里选取了手机(Phone)作为抽象,品牌(Brand)作为实现来进行设计的,同时将Brand聚合到Phone里面了; //接口 实现方 public

桥接模式 - 设计模式学习

主宰稳场 提交于 2020-02-29 22:13:20
  合成/聚合复用原则(CARP),尽量使用合成/聚合,尽量不要使用类继承。   合成和聚合都是关联的特殊种类。聚合表示一种弱的“拥有关系”,体现的是A对象可以包含B对象,但B对象不一定是A对象的一部分;合成则是一种枪的‘拥有’关系,体现了严格的部分和整体的关系,部分和整体的声明周期一样。比方说,大雁有两个翅膀,翅膀与大雁是部分和整体的关系,并且它们的声明周期是相同的,于是大雁和翅膀就是合成关系。而大雁是群居动物,所以每只大雁都是属于一个雁群,一个雁群可以有多只大雁,所以大雁和雁群是聚合关系。   合成/聚合复用原则的好处是,有限使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。   桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化。   什么叫抽象与它的实现分离,这并不是说,让抽象类与其派生类分离,因为这没有任何意义。实现指的是抽象类和它的派生类用来实现自己的对象。桥接模式主要讲的是尽量用聚合,而不要盲目使用继承。   下面给出桥接模式的UML图:        桥接模式的基本代码结构: namespace ConsoleApplication1 { abstract class Implementor { public abstract void

设计模式之适配器模式和桥接模式

随声附和 提交于 2020-02-28 15:30:02
今日语录 找工作就像适配器一样,对于没有强烈兴趣的工作,我们只有让自己像适配器一样,磨合磨合,发觉工作中的快乐,人生才不会索然无味,但是过程是艰辛的,加油,奥利给 结构型模式 1.适配器模式 对象适配器 类适配器 缺省适配器 就是适配器是由一个抽象类实现的 2.桥接模式 定义 : 将 抽象部分 与它的 实现部分 分离 个人觉得这个 https://www.cnblogs.com/WindSun/p/10260547.html 的桥接说的还可以 注:桥接和适配器都是把两个对象组合起来配合工作,但桥接的目标是分离,适配的目标是合并 来源: CSDN 作者: a_higher 链接: https://blog.csdn.net/a_higher/article/details/104553634

JAVA设计模式之桥接模式

て烟熏妆下的殇ゞ 提交于 2020-02-26 02:31:42
在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就要使用 桥接模式 。而具体使用的方式,则 是将抽象部分与他们的实现部分分离,使得它们都可以独立的变化。 手机,不同品牌的手机有着类似的功能,假设现在都具有通讯录和游戏功能。或许我们会这样设计实现这样的关系: 这种结构下如果增加一个音乐功能,每个品牌类中都会增加一个新的音乐子类。如果新增一个品牌类,则需要新增一个新的品牌类,并且品牌类下还要对应增加各个功能的子类。 又或者是这个: 这种结构下新增品牌和功能同样需要很大的改动。 上述情况出现的主要原因是:对象的继承关系在编译时就已经确定,无法在运行时改变从父类继承的实现。子类的实现与他的父类有非常紧密的关系,以至于父类实现中的任何变化必然会导致子类的变化。当你需要复用子类时,父类的实现如果不适合解决新的问题,则父类必须重写或被其他更适合的类代替。这种依赖关系限制了灵活性并最终限制了复用性。 面向对象的设计中,还有一个重要的原则:合成/聚合复用原则---优先使用对象合成/聚合,而不是继承。 聚合 (Aggregation)表示一种弱的拥有关系,体现的是A对象可以包含B对象,但是B不是A对象的一部分。 合成 (Composition

VMWare虚拟机提供的桥接、nat和主机模式的区别

£可爱£侵袭症+ 提交于 2020-02-25 02:57:52
VMWare提供三种工作模式桥接(bridge)、NAT(网络地址转换)和host-only(主机模式)。 桥接模式   在桥接模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机(主机和虚拟机处于对等地位),它可以访问网内任何一台机器。在桥接模式下,我们往往需要为虚拟主机配置IP地址、子网掩码等(注意虚拟主机的ip地址要和主机ip地址在同一网段)。   使用桥接模式的虚拟系统和主机的关系,就如同连接在一个集线器上的两台电脑;要让他们通讯就需要为虚拟系统配置ip地址和子网掩码。如果我们需要在局域网内建立一个虚拟服务器,并为局域网用户提供服务,那就要选择桥接模式。   但对于想进行种种网络实验的朋友这种模式是不太适合的,因为你无法对虚拟机的网络进行控制,它直接出去了。 NAT模式   在NAT模式下,虚拟系统需要借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。也就是说,使用NAT模式虚拟系统可把物理主机作为路由器访问互联网。NAT模式下的虚拟系统的TCP/IP配置信息是由VMnet8(NAT)虚拟网络的DHCP服务器提供的,无法进行手工修改,因此虚拟系统也就无法和本局域网中的其他真实主机进行通讯。采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可。   这种方式也可以实现Host

VMWare虚拟机提供的桥接、nat和主机模式的区别

左心房为你撑大大i 提交于 2020-02-25 02:56:25
VMWare提供三种工作模式桥接(bridge)、NAT(网络地址转换)和host-only(主机模式)。 桥接模式   在桥接模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机(主机和虚拟机处于对等地位),它可以访问网内任何一台机器。在桥接模式下,我们往往需要为虚拟主机配置IP地址、子网掩码等(注意虚拟主机的ip地址要和主机ip地址在同一网段)。   使用桥接模式的虚拟系统和主机的关系,就如同连接在一个集线器上的两台电脑;要让他们通讯就需要为虚拟系统配置ip地址和子网掩码。如果我们需要在局域网内建立一个虚拟服务器,并为局域网用户提供服务,那就要选择桥接模式。   但对于想进行种种网络实验的朋友这种模式是不太适合的,因为你无法对虚拟机的网络进行控制,它直接出去了。 NAT模式   在NAT模式下,虚拟系统需要借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。也就是说,使用NAT模式虚拟系统可把物理主机作为路由器访问互联网。NAT模式下的虚拟系统的TCP/IP配置信息是由VMnet8(NAT)虚拟网络的DHCP服务器提供的,无法进行手工修改,因此虚拟系统也就无法和本局域网中的其他真实主机进行通讯。采用NAT模式最大的优势是虚拟系统接入互联网非常简单,你不需要进行任何其他的配置,只需要宿主机器能访问互联网即可。   这种方式也可以实现Host

Java设计模式-桥接模式

筅森魡賤 提交于 2020-02-22 04:59:32
桥接模式 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。 这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。 我们通过下面的实例来演示桥接模式(Bridge Pattern)的用法。其中,可以使用相同的抽象类方法但是不同的桥接实现类,来画出不同颜色的圆。 介绍 意图:将抽象部分与实现部分分离,使它们都可以独立的变化。 主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。 何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。 如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。 关键代码:抽象类依赖实现类。 应用实例: 1、猪八戒从天蓬元帅转世投胎到猪,转世投胎的机制将尘世划分为两个等级,即:灵魂和肉体,前者相当于抽象化,后者相当于实现化。生灵通过功能的委派,调用肉体对象的功能,使得生灵可以动态地选择。 2、墙上的开关,可以看到的开关是抽象的,不用管里面具体怎么实现的。 优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。 缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。