(转载)深入浅出设计模式——桥接模式(Bridge Pattern)
模式动机
设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:
第一种设计方案是为每一种形状都提供一套各种颜色的版本。
第二种设计方案是根据实际需要对形状和颜色进行组合。
对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。
模式定义
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
Bridge Pattern: Decouple an abstraction from its implementation so that the two can vary independently.
Frequency of use: medium
UML图
模式结构
桥接模式包含如下角色:
Abstraction:抽象类
RefinedAbstraction:扩充抽象类
Implementor:实现类接口
ConcreteImplementor:具体实现类
模式分析
理解桥接模式,重点需要理解如何将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。
抽象化:抽象化就是忽略一些信息,把不同的实体当作同样的实体对待。在面向对象中,将对象的共同性质抽取出来形成类的过程即为抽象化的过程。
实现化:针对抽象化给出的具体实现,就是实现化,抽象化与实现化是一对互逆的概念,实现化产生的对象比抽象化更具体,是对抽象化事物的进一步具体化的产物。
脱耦:脱耦就是将抽象化和实现化之间的耦合解脱开,或者说是将它们之间的强关联改换成弱关联,将两个角色之间的继承关系改为关联关系。桥接模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用关联关系(组合或者聚合关系)而不是继承关系,从而使两者可以相对独立地变化,这就是桥接模式的用意。
模式实例与解析
手机软件何时统一—桥接模式
体系结构
Implementor:实现类接口HandsetSoft.cs
namespace BridgePattern {abstract class HandsetSoft{public abstract void Run();} }
ConcreteImplementor:具体实现类
游戏、通讯录等具体类
HandsetGame.cs
using System;namespace BridgePattern {class HandsetGame : HandsetSoft{public override void Run(){Console.WriteLine("运行手机游戏");}} }
HandsetAddressList.cs
using System;namespace BridgePattern {class HandsetAddressList : HandsetSoft{public override void Run(){Console.WriteLine("运行手机通讯录");}} }
Abstraction:抽象类 HandsetBrand.cs
namespace BridgePattern {//手机品牌abstract class HandsetBrand{protected HandsetSoft soft;//设置手机软件public void SetHandsetSoft(HandsetSoft soft){this.soft = soft;}//运行public abstract void Run();} }
RefinedAbstraction:扩充抽象类
HandsetBrandN.cs
namespace BridgePattern {//手机品牌Nclass HandsetBrandN : HandsetBrand{public override void Run(){soft.Run();}} }
HandsetBrandM.cs
namespace BridgePattern {class HandsetBrandM : HandsetBrand{public override void Run(){soft.Run();}} }
Client:客户类
using System;namespace BridgePattern {class Program{static void Main(string[] args){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();Console.Read();}} }
现在如果要增加一个功能,比如MP3音乐播放功能,那么只要增加HandsetMP3这个类就行了。不会影响其他任何类。类的个数增加也只是一个;
如果是要增加S品牌,只需要增加一个品牌子类HandsetBrandS就可以了。个数也是一个,不会影响其他类的改动。
模式优缺点
桥接模式的优点
分离抽象接口及其实现部分。
桥接模式有时类似于多继承方案,但是多继承方案违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差,而且多继承结构中类的个数非常庞大,桥接模式是比多继承方案更好的解决方法。
桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
实现细节对客户透明,可以对用户隐藏实现细节。
桥接模式的缺点
桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。
桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围具有一定的局限性。
模式适用环境
在以下情况下可以使用桥接模式:
如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。
虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。
转载于:https://www.cnblogs.com/h-meng/p/9652544.html
(转载)深入浅出设计模式——桥接模式(Bridge Pattern)相关推荐
- 【愚公系列】2021年12月 二十三种设计模式(七)-桥接模式(Bridge Pattern)
文章目录 前言 一.桥接模式(Bridge Pattern) 二.使用步骤 角色 示例 总结 优点 缺点 使用场景 前言 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分 ...
- 如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)
如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 标签: 设计模式初涉 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往 ...
- 【设计模式自习室】桥接模式 Bridge Pattern:处理多维度变化
前言 <设计模式自习室>系列,顾名思义,本系列文章带你温习常见的设计模式.主要内容有: 该模式的介绍,包括: 引子.意图(大白话解释) 类图.时序图(理论规范) 该模式的代码示例:熟悉该模 ...
- 设计模式--桥接模式(Bridge)
设计模式–桥接模式(Bridge) 1.定义 桥接模式:将抽象部分与它的实现部分分离,使它们可以独立地变化. 2.实例 设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图 ...
- Net设计模式实例之桥接模式( Bridge Pattern)(4)
3.客户端代码<?XML:NAMESPACE PREFIX = O /> static void <?XML:NAMESPACE PREFIX = ST2 />Main(str ...
- 极速理解设计模式系列:7.桥接模式(Bridge Pattern)
四个角色:抽象类(Abstraction).扩充抽象类(RefinedAbstraction).实现类接口(Implementor).具体实现类(ConcreteImplementor) 抽象类(Ab ...
- Net设计模式实例之桥接模式( Bridge Pattern)(2)
四.桥接模式实例分析(Example) 1.场景 业务对象(BusinessObject)与数据对象(DataObject)分离,即业务对象CustormerBase与数据对象DataObject分离 ...
- 【设计模式·结构型】桥接模式Bridge Pattern
目的 该模式用于分离抽象与实现,并且抽象与实现可以独立变化 应用场景 (1)希望抽象和实现之间没有固定的绑定关系,不同抽象接口和实现可以组合和扩充,程序运行时动态选择.切换具体实现 (2)类层次结构, ...
- 设计模式 -- 桥接模式(Bridge)
写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- 主要内容包括: 初始桥接 ...
最新文章
- alert 返回页面 刷新_详解 HTML 页面原生的生命周期事件
- DDoS***如此猖獗,我们该如何解决?
- Crontab 使用(转)
- 问题小结(二)——maven的核心功能、面向对象编程和面向接口编程的区别、抽象类和接口的区别等
- 开发者常用的 Sublime Text 3 插件
- 运营商在万物互联扮演什么角色?上海联通NB-IoT奠定基础
- python2读文件,python之文件的读写(2)
- 配置vivado用vscode编辑文本
- SparkStreaming读取Hdfs文件完成wordCount
- ets5怎么找到数据文件夹_如何对文件夹进行加密
- 扫雷源代码(C语言)
- 国内外有哪些有前景的 AR VR公司?
- docker安装教程
- 线性代数 --- 什么是矩阵的逆?(个人笔记扫描版)
- (二)什么是IT售前?为什么需要IT售前?
- 华为手机图标怎么变小_华为手机字太小看不清?那是你不会设置!四种方法让手机显示变大...
- 解决阿里云Workbench登录失败
- 热模块替换/热更新 HMR
- python五子棋ai_零基础学Python之—AI五子棋(1)
- 好嗨游戏:LPL春季赛决赛在即,黑8传奇JDG迎战S8冠军IG
热门文章
- RedHat/CentOS 7通过nmcli命令管理网络教程
- concat和concat_ws()区别及MySQL的几个实用字符串函数
- 绿色版mysql使用方法
- 人人网 6.0 版申请页面随着滚动条拖动背景图片滚动出现的原理
- 目录树结构改变后刷新目录树
- javascript迭代器_JavaScript迭代器概述
- 入职后发现公司是外包全职_我如何通过全职工作,伴侣和3岁的双胞胎男孩打造产品...
- 多伦多到温莎_我想要freeCodeCamp Toronto的Twitter来发布报价,所以我做了一个免费的bot来做到这一点。...
- 五款常用协议分析处理工具推荐
- zabbix部署onealert云警告平台