Bridge(桥接)模式
一、目的
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
二、背景
现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:
我们可以发现有很多的类,假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类。
试想,在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。为了更加灵活的设计系统,我们此时可以考虑使用桥接模式。
三、桥接模式要解决的问题
将抽象部分与它的实现部分分离,使他们都可以独立地变化。“将抽象部分与它的实现部分分离”指实现系统可能有多个角度分类,每一种分类都可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。
讲一下我自己的理解。比如有一个通话软件,它可以支持语音聊天和视频聊天,语音聊天和视频聊天的整体流程是一致的,即呼叫、聊天、关闭,我们可以定义聊天的抽象流程;
语音聊天和视频聊天的细节不同,因此我们定义语言聊天和视频聊天的具体类,在具体类中调用操作系统提供的细粒度接口来实现聊天功能:
1)语音聊天中调用系统的开启连接实现聊天软件的呼叫功能,随后调用传输语音数据进行语音聊天,最后调用系统的断开连接实现软件的关闭聊天;
2)语音聊天中我们需要调用系统的开启连接和开启相机来开始视频聊天,随后传输语音数据和图像数据进行视频聊天,最后调用系统的断开连接和关闭相机来关闭视频聊天;
为了让我们的软件为更多人服务,我们需要开发Android和IOS两个版本,此时我们在聊天功能中调用不同操作系统的连接、开启相机、传送数据、关闭相机、断开连接。
为了让聊天软件的聊天功能和不同的操作系统解耦,我们将创建OS接口,用于抽象不同操作系统提供的连接、开启相机、传送数据、关闭相机、断开连接等细粒度接口,然后AndroidOs和IOS两个子类去分别实现不同操作系统的具体细节。
我们将聊天软件的抽象和它的实现部分分别放在独立的类层次结构中。其中一个层次结构针对聊天软件(语音聊天和视频聊天),这个类层次的抽象是Call;另一个独立的类层次结构针对平台相关的细粒度接口(包括Android和IOS),这个类层次的抽象是OS;而Call的子类的所有关于操作系统的操作都是通过接口OS实现的。这就将聊天软件的抽象和平台相关的实现部分分离开来。此时,我们将Call和OS之间的关系称为桥接,因为它在抽象类与它的实现之间起到桥梁的作用,使他们可以独立地变化。
四、UML类图
五、参与类的职责
1.Abstract:定义抽象类的接口;维护一个指向Implementor类型对象的引用;
2.RefinedAbstraction:扩充由Abstraction定义的接口;
3.Implementor:定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;Implementor仅提供基本操作,Abstraction则着重定义基于这些基本操作的较高层次的操作;
4.ConcreteImplementor:实现Implementor接口并定义它的具体实现;
六、协作方式
Abstraction将Client的请求转发给它的Implementor对象。RefinedAbstraction实现Abstraction中定义的抽象部分,ConcreteImplementor则实现Implementor中定义的抽象部分,最终RefinedAbstraction和ConcreteImplementor独立实现细节,Abstraction和Implementor则作为稳定的抽象部分。
七、达到的效果
1)分离接口及实现部分:接口与实现分离有助于分层,产生更好的结构化系统,系统的高层次部分仅需要关注抽象接口即可。
2)提高可扩展性:在一个维度有变化,不需要调整另外一个维度的任何代码;可以独立地对多个维度进行扩展。
3)实现细节对客户透明:客户不需要关注任何实现细节,仅仅需要关注抽象类逻辑。
八、代码示例
https://github.com/xszhaob/my-java-design-patterns
Bridge(桥接)模式相关推荐
- C++设计模式-Bridge桥接模式
作用:将抽象部份与它的实现部份分离,使它们都可以独立地变化. 将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式 ...
- 步步为营 .NET 设计模式学习笔记 十三、Bridge (桥接模式)
概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种"多维度的变化"?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引 ...
- Scala 与设计模式(六):Bridge 桥接模式
相信大家都玩过「俄罗斯方块」吧. 小罗年幼时最喜欢玩的就是俄罗斯方块.作为一个有情怀的程序员,小罗决定尝试实现这款游戏. 玩过俄罗斯方块的人都会知道,俄罗斯方块由七种简单形状组成: I.J.L.O.S ...
- Bridge - 桥接模式
1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种"多维度的变化"?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而 ...
- 设计模式(八):Bridge桥接模式 -- 结构型模式
1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种"多维度的变化"?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而 ...
- [php]php设计模式 Bridge (桥接模式)
1 <?php 2 /** 3 * 桥接模式 4 * 5 * 将抽象部份与它实现部分分离,使用它们都可以有独立的变化 6 */ 7 abstractclass Implementor 8 { 9 ...
- Bridge 桥接模式
定义 桥接模式是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦. 这种模式涉及到一个作为桥接的接口,使得实体 ...
- 设计模式-结构型模式 -bridge 桥接模式
桥接模式更注重:两个可变维度的拓展 不能用继承 容易造成类爆炸 四个角色:实现化 (定义接口方法 ) 具体实现化 implement实现化接口 并重写方法 抽象化 :聚合实现化接口 并初始化 重写方法 ...
- 6中结构型设计模式的对比理解(Composite组合模式,Proxy代理模式,Flyweight享元模式,Facade门面模式,Bridge桥接模式,Decorator装饰器模式)
结构型模式 结构型模式用来组装 类和对象,以获得更大的结构. 结构型类模式,通过继承机制来组合接口或类.简单的例子就是多重继承,最后一个类拥有所有父类的性质.这个模式有助于独立开发一个协同类.另一个例 ...
- Java 设计模式之Bridge桥接模式
将抽象和具体实现两个维度分离,让他们独立发展,并且在抽象类里聚合一个具体实现,通过聚合替代继承,用于解决类爆炸的问题. 这种模式要求对系统的抽象的理解和设计难度都比较大. 例子: 这里要对花,气球等装 ...
最新文章
- GTK+图形化应用程序开发学习笔记
- 修改Docker0网桥默认网段
- bpython使用_使用Python实现一个简单的A/B测试
- Qt中线程的简单使用
- JSP自定义标签_通过属性控制标签体的执行次数
- 远程mysql用ssh连接_使用SSH密钥连接到远程MySQL服务器
- 斯坦福教授ICLR演讲:图网络最新进展GraphRNN和GCPN(附PPT下载)
- 最值得收藏的 数值分析 全部知识点思维导图整理(东北大学慕课课程)(持续更新中)
- 机器人——人类工作和生活的助手(科普)
- python批量读取tiff文件_Python Pillow批量转换tif格式到jpg
- 网站实现GNSS数据批量下载
- 一张图回顾Hadoop十年 Hadoop老矣,尚能饭否
- 屏幕录制视频时有杂音怎么办?
- 中国剩余定理 (孙子定理) 的证明和代码
- hadoop完全分布+hive数据分析
- echarts显示中国地图
- UEM系列(二)初识UEM“探针”技术
- 河南计算机专业考公要求,2017河南公务员专业需求类别(专业分类)
- vmware 虚拟机下 ubuntu 与主机共享锐捷
- 关于钉钉打卡的另一种实现思路
热门文章
- 图像数据标注工具labelme使用教程
- 服务器部署随笔-nfs minio 端口映射
- 汽车零部件RFID解决方案
- note3 android l,KingRoot: 独家宣布,一键Root Android L版三星手机
- ArrayList类的基本使用,基本数据类型和包装类,字符串转换
- 2021年西飞一中高考成绩查询,2020陕西高中学业水平考试成绩查询系统
- 花雨庭服务器如何发消息,我的世界花雨庭服务器里如何建造家园quest; | 手游网游页游攻略大全...
- python 人脸检测_厉害了,用Python一行代码实现人脸识别
- 商业价值:苹果iTV,再一次改变世界?
- 【第76期】50条有趣的Python一行代码,建议收藏!