索引

  • 别名
  • 意图
  • 结构
  • 参与者
  • 适用性
  • 效果
  • 相关模式
  • 实现
    • 实现方式(一):使用 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(桥接)相关推荐

  1. [转载] C#面向对象设计模式纵横谈——8. Bridge桥接模式

    主讲:李建忠 来源:http://www.microsoft.com/china/msdn/events/webcasts/shared/webcast/consyscourse/CsharpOOD. ...

  2. C++设计模式-Bridge桥接模式

    作用:将抽象部份与它的实现部份分离,使它们都可以独立地变化. 将抽象(Abstraction)与实现(Implementation)分离,使得二者可以独立地变化. 桥接模式号称设计模式中最难理解的模式 ...

  3. 设计模式之美总结(结构型篇)

    title: 设计模式之美总结(结构型篇) date: 2022-12-21 09:59:11 tags: 设计模式 categories: 设计模式 cover: https://cover.png ...

  4. 本人亲自整理的极客时间设计模式之美下部的硬核笔记(残缺版)最近加班太多,搞不了太多,只能尽量了xd们

    设计模式之美(下)https://www.yuque.com/zcming123/uygxde/cbwnad 这位猿,三连,再走吧! 以下内容是为了让搜索引擎,检测到这篇文章.要阅读体验,请点击上面的 ...

  5. 漫谈设计模式--3分钟理解桥接模式:笔和画的关系

    其实不需要3分钟,3秒钟就够了,记住桥接模式就是如此简单:一句话,笔有千般形,画有万变化. 下面的仅仅助于理解. 1. 定义 The bridge pattern is a design patter ...

  6. 设计模式一网打尽,40余篇文章带你领略设计模式之美

    文章末尾附带GitHub开源下载地址. 该文章的最新版本已迁移至个人博客[比特飞],单击链接 设计模式一网打尽,40余篇文章带你领略设计模式之美 | .Net中文网 访问. 设计模式概述 20世纪80 ...

  7. 最新Java设计模式之美

    目录: ┣━━不定期加餐 (3讲) ┃    ┣━━加餐一丨用一篇文章带你了解专栏中用到的所有Java语法.html ┃    ┣━━加餐一丨用一篇文章带你了解专栏中用到的所有Java语法.m4a ┃ ...

  8. 设计模式之美总结(面向对象篇)

    title: 设计模式之美总结(面向对象篇) date: 2022-10-11 17:02:54 tags: 设计模式 categories: 技术书籍及课程 cover: https://cover ...

  9. 设计模式之美-王争-极客时间-返现24元 限时优惠

    极客时间出品的<设计模式之美>由王争所作,王争是前Google工程师手把手教你写高质量代码 前Google工程师,<数据结构与算法之美>专栏作者.本专栏前Google工程师手把 ...

最新文章

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

热门文章

  1. 顺风车Android性能优化之View布局优化
  2. 敬业签电脑手机云同步便签及安卓手机和苹果手机云同步桌面便签
  3. abp 基于api接口的页面内容提交
  4. #9 shell脚本的函数运用
  5. Linux的运行级别和chkconfig用法
  6. iOS开发 - OC - 苹果为大家提供的后台:CloudKit 的简单使用
  7. Leetcode 17.电话号码的组合(回溯法)
  8. B-树关键字个数计算
  9. 【Python】EXCEL转Json
  10. mysql之主从复制