索引

  • 别名
  • 意图
  • 结构
  • 参与者
  • 适用性
  • 效果
  • 相关模式
  • 实现
    • 实现方式(一):使用 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. [转]C#多线程学习(四) 多线程的自动管理(线程池)
  2. 【Android 逆向】Android 中常用的 so 动态库 ( libdvm.so | libart.so | libandroid_runtime.so | libandroidfw.so )
  3. INT(M)表示什么意思?
  4. matlab小波三维图,matlab小波包变换估计时变功率谱三维图出图和理想不一样
  5. [UVALive 3971] Assemble
  6. .net面试题大全,绝大部分面试题
  7. 最佳字符串对齐的Java实现
  8. 数据新动能:帆软第四届智数大会圆满落幕
  9. FreeEIM在树上一会儿荡秋千
  10. java 进制转换算法_算法笔记_033:十六进制转八进制(Java)
  11. python导出mysql授权语句
  12. Hdu2660 Accepted Necklace【简单dfs】
  13. 通过手机获取微信公众号封面
  14. 纸壳CMS(ZKEACMS)体验升级,快速创建页面,直接在页面中修改内容
  15. VTK:交互与拾取——单位拾取
  16. maven+ssm+redis配置demo
  17. 看雪CTF2020 KCTF 秋季赛 签到题
  18. 如何在Mac上停止使用iCloud照片库?
  19. 计算机基础科学悖论,细思极恐的科学悖论,盘点科学史上最难解释的10大悖论...
  20. java简单计算器课程设计报告_JAVA课程设计之计算器设计报告

热门文章

  1. 开课吧:C++基础之字符串匹配之BM算法(Boyer-Moore)
  2. TensorFlow入门(2)矩阵基础
  3. 搭建fabric-sample/balance-transfer网络详解
  4. vue2.x 给一个对象里添加一个没有的属性
  5. [20171113]修改表结构删除列相关问题2.txt
  6. redis教程(七)之redis List
  7. 终端服务器超出了最大允许连接数
  8. 洛谷 P1451【细胞】
  9. Salesforce LWC学习(二) helloWorld程序在VSCode中的实现
  10. Linux 攻击防护基础排查