设计模式之美:Bridge(桥接)
索引
- 别名
- 意图
- 结构
- 参与者
- 适用性
- 效果
- 相关模式
- 实现
- 实现方式(一):使用 Bridge 模式分离抽象部分和实现部分。
别名
- Handle
- Body
意图
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Decouple an abstraction from its implementation so that the two can vary independently.
结构
参与者
Abstraction
- 定义抽象类的接口。
- 维护一个指向 Implementor 类型对象的指针。
RefinedAbstraction
- 扩充由 Abstraction 定义的接口。
Implementor
- 定义实现类的接口,该接口不一定要与 Abstraction 接口完全一致,甚至可以完全不同。
- Implementor 接口仅提供基本操作,Abstraction 则定义了基于这些基本操作的较高层次的操作。
ConcreteImplementor
- 实现 Implementor 接口并定义它的具体实现。
适用性
在以下情况下可以使用 Bridge 模式:
- 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。比如需要在程序运行时刻实现部分应可以被选择或者切换。
- 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。
- 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
- 你想对客户完全隐藏抽象的实现部分。
- 类的层次需要将一个对象分解成两个部分。
- 你想在多个对象间共享实现,但同时要求客户并不知道这一点。
效果
- 分离接口及其实现部分。
- 提高可扩充性。
- 实现细节对客户透明。
相关模式
- Abstract Factory 模式可以用来创建和配置一个特定的 Bridge 模式。
- Adaptor 模式用来帮助无关的类协同工作,它通常在系统设计完成后才会被使用。Bridge 模式则是在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变。
- Bridge 模式的结构与对象 Adapter 模式类似,但是 Bridge 模式的出发点不同:Bridge 目的是将接口部分和实现部分分离,从而对它们可以较为容易也相对独立的加以改变。而 Adapter 则意味着改变一个已有对象的接口。
实现
实现方式(一):使用 Bridge 模式分离抽象部分和实现部分。
当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。
但是此方法有时不够灵活。继承机制将抽象部分与它的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用。
使用 Bridge 模式,它在抽象类与它的实现直接起到了桥梁作用,使它们可以独立地变化。
1 namespace BridgePattern.Implementation1 2 { 3 public class Abstraction 4 { 5 protected IImplementor _implementor; 6 7 public Abstraction(IImplementor implementor) 8 { 9 _implementor = implementor; 10 } 11 12 public virtual void Operation() 13 { 14 _implementor.OperationImp1(); 15 } 16 } 17 18 public interface IImplementor 19 { 20 void OperationImp1(); 21 } 22 23 public class ConcreteImplementorA : IImplementor 24 { 25 public void OperationImp1() 26 { 27 // do something 28 } 29 } 30 31 public class ConcreteImplementorB : IImplementor 32 { 33 public void OperationImp1() 34 { 35 // do something 36 } 37 } 38 39 public class ChildAbstraction : Abstraction 40 { 41 public ChildAbstraction(IImplementor implementor) 42 : base(implementor) 43 { 44 } 45 46 public override void Operation() 47 { 48 base.Operation(); 49 // do some others 50 } 51 } 52 53 public class Client 54 { 55 public void TestCase1() 56 { 57 IImplementor implementor1 = new ConcreteImplementorA(); 58 IImplementor implementor2 = new ConcreteImplementorB(); 59 60 Abstraction abstraction1 = new Abstraction(implementor1); 61 Abstraction abstraction2 = new ChildAbstraction(implementor2); 62 63 abstraction1.Operation(); 64 abstraction2.Operation(); 65 } 66 } 67 }
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
设计模式之美:Bridge(桥接)相关推荐
- [转载] C#面向对象设计模式纵横谈——8. Bridge桥接模式
主讲:李建忠 来源:http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/CsharpOOD. ...
- C++设计模式-Bridge桥接模式
作用:将抽象部份与它的实现部份分离,使它们都可以独立地变化. 将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式 ...
- 设计模式之美总结(结构型篇)
title: 设计模式之美总结(结构型篇) date: 2022-12-21 09:59:11 tags: 设计模式 categories: 设计模式 cover: https://cover.png ...
- 本人亲自整理的极客时间设计模式之美下部的硬核笔记(残缺版)最近加班太多,搞不了太多,只能尽量了xd们
设计模式之美(下)https://www.yuque.com/zcming123/uygxde/cbwnad 这位猿,三连,再走吧! 以下内容是为了让搜索引擎,检测到这篇文章.要阅读体验,请点击上面的 ...
- 漫谈设计模式--3分钟理解桥接模式:笔和画的关系
其实不需要3分钟,3秒钟就够了,记住桥接模式就是如此简单:一句话,笔有千般形,画有万变化. 下面的仅仅助于理解. 1. 定义 The bridge pattern is a design patter ...
- 设计模式一网打尽,40余篇文章带你领略设计模式之美
文章末尾附带GitHub开源下载地址. 该文章的最新版本已迁移至个人博客[比特飞],单击链接 设计模式一网打尽,40余篇文章带你领略设计模式之美 | .Net中文网 访问. 设计模式概述 20世纪80 ...
- 最新Java设计模式之美
目录: ┣━━不定期加餐 (3讲) ┃ ┣━━加餐一丨用一篇文章带你了解专栏中用到的所有Java语法.html ┃ ┣━━加餐一丨用一篇文章带你了解专栏中用到的所有Java语法.m4a ┃ ...
- 设计模式之美总结(面向对象篇)
title: 设计模式之美总结(面向对象篇) date: 2022-10-11 17:02:54 tags: 设计模式 categories: 技术书籍及课程 cover: https://cover ...
- 设计模式之美-王争-极客时间-返现24元 限时优惠
极客时间出品的<设计模式之美>由王争所作,王争是前Google工程师手把手教你写高质量代码 前Google工程师,<数据结构与算法之美>专栏作者.本专栏前Google工程师手把 ...
最新文章
- [转]C#多线程学习(四) 多线程的自动管理(线程池)
- 【Android 逆向】Android 中常用的 so 动态库 ( libdvm.so | libart.so | libandroid_runtime.so | libandroidfw.so )
- INT(M)表示什么意思?
- matlab小波三维图,matlab小波包变换估计时变功率谱三维图出图和理想不一样
- [UVALive 3971] Assemble
- .net面试题大全,绝大部分面试题
- 最佳字符串对齐的Java实现
- 数据新动能:帆软第四届智数大会圆满落幕
- FreeEIM在树上一会儿荡秋千
- java 进制转换算法_算法笔记_033:十六进制转八进制(Java)
- python导出mysql授权语句
- Hdu2660 Accepted Necklace【简单dfs】
- 通过手机获取微信公众号封面
- 纸壳CMS(ZKEACMS)体验升级,快速创建页面,直接在页面中修改内容
- VTK:交互与拾取——单位拾取
- maven+ssm+redis配置demo
- 看雪CTF2020 KCTF 秋季赛 签到题
- 如何在Mac上停止使用iCloud照片库?
- 计算机基础科学悖论,细思极恐的科学悖论,盘点科学史上最难解释的10大悖论...
- java简单计算器课程设计报告_JAVA课程设计之计算器设计报告
热门文章
- 开课吧:C++基础之字符串匹配之BM算法(Boyer-Moore)
- TensorFlow入门(2)矩阵基础
- 搭建fabric-sample/balance-transfer网络详解
- vue2.x 给一个对象里添加一个没有的属性
- [20171113]修改表结构删除列相关问题2.txt
- redis教程(七)之redis List
- 终端服务器超出了最大允许连接数
- 洛谷 P1451【细胞】
- Salesforce LWC学习(二) helloWorld程序在VSCode中的实现
- Linux 攻击防护基础排查