1. #include<iostream>
  2. using namespace std;
  3.  
  4. class AbstractionImp
  5. {
  6. public:
  7. virtual ~AbstractionImp();
  8. virtual void Operation() = ;
  9. protected:
  10. AbstractionImp();
  11. private:
  12. };
  13.  
  14. class Abstraction
  15. {
  16. public:
  17. virtual ~Abstraction();
  18.  
  19. virtual void Operation() = ;
  20.  
  21. protected:
  22. Abstraction();
  23.  
  24. private:
  25.  
  26. };
  27.  
  28. class RefinedAbstraction:public Abstraction
  29. {
  30. public:
  31. RefinedAbstraction(AbstractionImp* imp);
  32.  
  33. ~RefinedAbstraction();
  34.  
  35. void Operation();
  36.  
  37. protected:
  38.  
  39. private:
  40. AbstractionImp* _imp;
  41.  
  42. };
  43.  
  44. Abstraction::Abstraction()
  45. {
  46.  
  47. }
  48.  
  49. Abstraction::~Abstraction()
  50. {
  51.  
  52. }
  53.  
  54. RefinedAbstraction::RefinedAbstraction(AbstractionImp* imp)
  55. {
  56. _imp = imp;
  57. }
  58.  
  59. RefinedAbstraction::~RefinedAbstraction()
  60. {
  61.  
  62. }
  63.  
  64. void RefinedAbstraction::Operation()
  65. {
  66. _imp->Operation();
  67. }
  68.  
  69. class ConcreteAbstractionImpA:public AbstractionImp
  70. {
  71. public:
  72. ConcreteAbstractionImpA();
  73. ~ConcreteAbstractionImpA();
  74. virtual void Operation();
  75. protected:
  76. private:
  77. };
  78. class ConcreteAbstractionImpB:public AbstractionImp
  79. {
  80. public:
  81. ConcreteAbstractionImpB();
  82. ~ConcreteAbstractionImpB();
  83. virtual void Operation();
  84. protected:
  85. private:
  86. };
  87.  
  88. AbstractionImp::AbstractionImp()
  89. {
  90. }
  91. AbstractionImp::~AbstractionImp()
  92. {
  93. }
  94. void AbstractionImp::Operation()
  95. {
  96. cout<<"AbstractionImp....imp..."<<endl;
  97. }
  98. ConcreteAbstractionImpA::ConcreteAbstractionImpA()
  99. {
  100. }
  101. ConcreteAbstractionImpA::~ConcreteAbstractionImpA()
  102. {
  103. }
  104. void ConcreteAbstractionImpA::Operation()
  105. {
  106. cout<<"ConcreteAbstractionImpA...."<<endl;
  107. }
  108. ConcreteAbstractionImpB::ConcreteAbstractionImpB()
  109. {
  110. }
  111. ConcreteAbstractionImpB::~ConcreteAbstractionImpB()
  112. {
  113. }
  114. void ConcreteAbstractionImpB::Operation()
  115. {
  116. cout<<"ConcreteAbstractionImpB...."<<endl;
  117. }
  118.  
  119. int main(int argc,char* argv[])
  120. {
  121. AbstractionImp* imp = new ConcreteAbstractionImpA();
  122. Abstraction* abs = new RefinedAbstraction(imp);
  123. abs->Operation();
  124.  
  125. imp = new ConcreteAbstractionImpB();
  126. abs = new RefinedAbstraction(imp);
  127. abs->Operation();
  128.  
  129. return ;
  130. }

输出:

  1. ConcreteAbstractionImpA....
  2. ConcreteAbstractionImpB....

[DP]书上定义:将抽象部分与它的实现部分分离,使它们都可以独立地变化。考虑装操作系统,有多种配置的计算机,同样也有多款操作系统。如何运用桥接模式呢?可以将操作系统和计算机分别抽象出来,让它们各自发展,减少它们的耦合度。当然了,两者之间有标准的接口。这样设计,不论是对于计算机,还是操作系统都是非常有利的。下面给出这种设计的UML图,其实就是桥接模式的UML图。

给出C++的一种实现:

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. class OS
  5. {
  6. public:
  7. virtual void InstallOS_Imp() {}
  8. };
  9. class WindowOS: public OS
  10. {
  11. public:
  12. void InstallOS_Imp() { cout<<"Install window OS"<<endl; }
  13. };
  14. class LinuxOS: public OS
  15. {
  16. public:
  17. void InstallOS_Imp() { cout<<"Install Linux OS"<<endl; }
  18. };
  19. class UnixOS: public OS
  20. {
  21. public:
  22. void InstallOS_Imp() { cout<<"Install UnixOS" <<endl; }
  23. };
  24.  
  25. class Computer
  26. {
  27. public:
  28. virtual void InstallOS(OS *os) {}
  29. };
  30. class DellComputer: public Computer
  31. {
  32. public:
  33. void InstallOS(OS *os) { os->InstallOS_Imp(); }
  34. };
  35. class AppleComputer: public Computer
  36. {
  37. public:
  38. void InstallOS(OS *os) { os->InstallOS_Imp(); }
  39. };
  40. class HPComputer: public Computer
  41. {
  42. public:
  43. void InstallOS(OS *os) { os->InstallOS_Imp(); }
  44. };
  45.  
  46. int main()
  47. {
  48. OS *os1 = new WindowOS();
  49. OS *os2 = new LinuxOS();
  50. Computer *computer1 = new AppleComputer();
  51. Computer *computer2 = new HPComputer();
  52. computer1->InstallOS(os1);
  53. computer2->InstallOS(os2);
  54. }

输出:

  1. Install window OS
  2. Install Linux OS

Bridge 是设计模式中比较复杂和难理解的模式之一,也是 OO 开发与设计中经常会用到
的模式之一。使用组合(委托)的方式将抽象和实现彻底地解耦,这样的好处是抽象和实现
可以分别独立地变化,系统的耦合性也得到了很好的降低。
GoF 在说明 Bridge 模式时,在意图中指出 Bridge 模式“将抽象部分与它的实现部分分
离,使得它们可以独立地变化”。

实际上上面使用 Bridge 模式和使用带来问题方式的解决方案的根本区别在于是通过继
承还是通过组合的方式去实现一个功能需求。因此面向对象分析和设计中有一个原则就是:
Favor Composition Over Inheritance。

[设计模式] 7 桥接模式 bridge的更多相关文章

  1. 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern)

    原文:乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 桥接模式(Bridge Pattern) 作者:webabcd 介绍 ...

  2. 【设计模式】桥接模式 Bridge Pattern

    开篇还是引用吕振宇老师的那篇经典的文章<设计模式随笔-蜡笔与毛笔的故事>.这个真是太经典了,没有比这个例子能更好的阐明桥接模式了,这里我就直接盗来用了. 现在市面上卖的蜡笔很多,各种型号, ...

  3. python 设计模式之桥接模式 Bridge Pattern

    #写在前面 前面写了那么设计模式了,有没有觉得有些模式之间很类似,甚至感觉作用重叠了,模式并不是完全隔离和独立的,有的模式内部其实用到了其他模式的技术,但是又有自己的创新点,如果一味地认为每个模式都是 ...

  4. 二十四种设计模式:桥接模式(Bridge Pattern)

    桥接模式(Bridge Pattern) 介绍将抽象部分与它的实现部分分离,使它们都可以独立地变化. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,现在使这些操作的抽象 ...

  5. 设计模式之桥接模式(Bridge)--结构模型

    1.意图 将抽象部分与它的实现部分分离,使它们可以独立地变化. 2.适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系. 类的抽象与它的实现都应该可以通过子类的方式加以扩展. 抽象部分与实现 ...

  6. 设计模式 笔记 桥接模式 Bridge

    //---------------------------15/04/15---------------------------- //Bridge 桥接模式----对象结构型模式 /* 1:意图:将 ...

  7. 设计模式之桥接模式(Bridge)

    桥接模式与原理:将抽象部分与实现部分分离,使它们都可以独立的变化.最终的结果表现在实现类中.两者之间属于等价关系,即实现部分和抽象部分可以相互交换. 代码如下 #include <iostrea ...

  8. 结构型设计模式之桥接模式(Bridge)

    结构 意图 将抽象部分与它的实现部分分离,使它们都可以独立地变化. 适用性 你不希望在抽象和它的实现部分之间有一个固定的绑定关系.例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换. ...

  9. 【设计模式】—— 桥接模式Bridge

    前言:[模式总览]——————————by xingoo 模式意图 这个模式使用的并不多,但是思想确实很普遍.就是要分离抽象部分与实现部分. 实现弱关联,即在运行时才产生依赖关系. 降低代码之间的耦合 ...

随机推荐

  1. 整理一下前段时间在写iOS app时所涉及的东西

    在刚学习和做完一个android app后,看了两周的Objective-C就开始做这个项目,所以整个app代码有很多现学现用的东西,今天来总结一下. 这个名为VID的app是用于公司产品的研发与de ...

  2. iOS中—触摸事件详解及使用

    iOS中--触摸事件详解及使用 (一)初识 要想学好触摸事件,这第一部分的基础理论是必须要学会的,希望大家可以耐心看完. 1.基本概念: 触摸事件 是iOS事件中的一种事件类型,在iOS中按照事件划分 ...

  3. 为apache与mysql创建快捷方式

    为apache与mysql创建快捷方式 1)为apache创建快捷方式(软链接) 以后我们就可以在终端的任一位置,使用apachectl start|stop|restart   2)为mysql创建 ...

  4. 'hibernate.dialect' must be set when no Connection avalable

    'hibernate.dialect' must be set when no Connection avalable 当连接不可用时,必须要设置Hibernate方言 搜索大多数的解决办法是:首先查 ...

  5. 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m

    给定两个数m,n,其中m是一个素数. 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m. 输入 第一行是一个整数s(0<s<=100),表示测试数据的组数 随后 ...

  6. 济南学习 Day 1 T2 am

    死亡[问题描述]现在有M个位置可以打 sif,有N +1个人在排队等着打 sif.现在告诉你 个人每个人需要多长的时间打 sif,问你第N +1个人什么时候才能打 sif. (前N个人必须按照顺序来) ...

  7. SQL Server死锁的分析、处理与预防

    1.基本原理 所谓“死锁”,在操作系统的定义是:在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 定义比较抽象,下图可以帮助你比较直观的 ...

  8. sql常用的星期方法

    sql常用的星期方法: SELECT convert(varchar(10),DATEADD(wk, DATEDIFF(wk,0,getdate()), 0),120) --本周开始周一SELECT ...

  9. UILabel滚动字幕的实现

    经常需要在应用中显示一段很长的文字,比如天气或者广告等,这时候使用滚动字幕的方式比较方便. 参考文献: [1] YouXianMing, 使用UILabel实现滚动字幕移动效果, 博客园 [2] ht ...

  10. Winform ListView根据条件定位到指定行

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...