设计模式之美: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工程师手把 ...
最新文章
- 在linux(centos7)下本地仓库的搭建
- 数据库选型绕不开“CAP定理”是什么
- 【译】Android系统简介—— Activity
- python 的基础 学习 第七天 is id 编码的补充
- OpenCASCADE:拓扑 API之缝纫
- 福布斯评选 8 位 AI 风云女性,李飞飞、Coursera 创始人在列
- 20155301 Exp4 恶意代码分析
- Doing It in User Space
- 凌复华:冯·诺依曼在量子力学领域的贡献
- Jupyter notebook系列(2):使用技巧(快捷键,多行输出,多光标操作,Unix系统命令的使用,查看输入输出历史,保存记录点与分享,抑制文末输出,图片输出,多环境kernel切换)
- mybatis (高级映射 缓存 延迟加载)
- Java读取Excel,03版本和07版本
- (附源码)计算机毕业设计SSM基于ETC用户的自驾游推荐系统
- 做为一个开源软件开发者,需要什么样的开源许可证?(一)
- ios-提升之【1】-UIApplication
- 比特数据结构与算法(第二章收尾)带头双向循环链表的实现
- 大数值:bigInteger---2^64次方
- Microsoft Visual Studio Installer Project下载太慢
- autoit对于web中flash控件的操作
- 《Python机器学习及实践》----良/恶性乳腺癌肿瘤预测