一、产生背景

  这里以电视遥控器的一个例子来引出桥接模式解决的问题,首先,我们每个牌子的电视机都有一个遥控器,此时我们能想到的一个设计是——把遥控器做为一个抽象类,抽象类中提供遥控器的所有实现,其他具体电视品牌的遥控器都继承这个抽象类,具体设计类图如下:

这样的实现使得每部不同型号的电视都有自己遥控器实现,这样的设计对于电视机的改变可以很好地应对,只需要添加一个派生类就搞定了,但随着时间的推移,用户需要改变遥控器的功能,如:用户可能后面需要对遥控器添加返回上一个台等功能时,此时上面的设计就需要修改抽象类RemoteControl的提供的接口了,此时可能只需要向抽象类中添加一个方法就可以解决了,但是这样带来的问题是我们改变了抽象的实现,如果用户需要同时改变电视机品型号和遥控器功能时,上面的设计就会导致相当大的修改,显然这样的设计并不是好的设计。然而使用桥接模式可以很好地解决这个问题,下面让我具体看看桥接模式是如何实现的。

意图:将抽象部分与实现部分分离,使它们都可以独立的变化。

主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活。

何时使用:实现系统可能有多个角度分类,每一种角度都可能变化。

如何解决:把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

二、实现方式

把这种多角度分类分离出来,让它们独立变化,减少它们之间耦合。

三、实例

抽象化部分的代码:

 
  1. /// <summary>
  2. /// 抽象概念中的遥控器,扮演抽象化角色
  3. /// </summary>
  4. public class RemoteControl
  5. {
  6. // 字段
  7. private TV implementor;
  8.  
  9. // 属性
  10. public TV Implementor
  11. {
  12. get { return implementor; }
  13. set { implementor = value; }
  14. }
  15.  
  16. /// <summary>
  17. /// 开电视机,这里抽象类中不再提供实现了,而是调用实现类中的实现
  18. /// </summary>
  19. public virtual void On()
  20. {
  21. implementor.On();
  22. }
  23.  
  24. /// <summary>
  25. /// 关电视机
  26. /// </summary>
  27. public virtual void Off()
  28. {
  29. implementor.Off();
  30. }
  31.  
  32. /// <summary>
  33. /// 换频道
  34. /// </summary>
  35. public virtual void SetChannel()
  36. {
  37. implementor.tuneChannel();
  38. }
  39. }
  40.  
  41. /// <summary>
  42. /// 具体遥控器
  43. /// </summary>
  44. public class ConcreteRemote : RemoteControl
  45. {
  46. public override void SetChannel()
  47. {
  48. Console.WriteLine("---------------------");
  49. base.SetChannel();
  50. Console.WriteLine("---------------------");
  51. }
  52. }

遥控器的实现方法部分代码,即实现化部分代码,此时我们用另外一个抽象类TV封装了遥控器功能的变化,具体实现交给具体型号电视机去完成:

  1. /// <summary>
  2. /// 电视机,提供抽象方法
  3. /// </summary>
  4. public abstract class TV
  5. {
  6. public abstract void On();
  7. public abstract void Off();
  8. public abstract void tuneChannel();
  9. }
  10.  
  11. /// <summary>
  12. /// 长虹牌电视机,重写基类的抽象方法
  13. /// 提供具体的实现
  14. /// </summary>
  15. public class ChangHong : TV
  16. {
  17. public override void On()
  18. {
  19. Console.WriteLine("长虹牌电视机已经打开了");
  20. }
  21.  
  22. public override void Off()
  23. {
  24. Console.WriteLine("长虹牌电视机已经关掉了");
  25. }
  26.  
  27. public override void tuneChannel()
  28. {
  29. Console.WriteLine("长虹牌电视机换频道");
  30. }
  31. }
  32.  
  33. /// <summary>
  34. /// 三星牌电视机,重写基类的抽象方法
  35. /// </summary>
  36. public class Samsung : TV
  37. {
  38. public override void On()
  39. {
  40. Console.WriteLine("三星牌电视机已经打开了");
  41. }
  42.  
  43. public override void Off()
  44. {
  45. Console.WriteLine("三星牌电视机已经关掉了");
  46. }
  47.  
  48. public override void tuneChannel()
  49. {
  50. Console.WriteLine("三星牌电视机换频道");
  51. }
  52. }

采用桥接模式的客户端调用代码:

  1. /// <summary>
  2. /// 以电视机遥控器的例子来演示桥接模式
  3. /// </summary>
  4. class Client
  5. {
  6. static void Main(string[] args)
  7. {
  8. // 创建一个遥控器
  9. RemoteControl remoteControl = new ConcreteRemote();
  10. // 长虹电视机
  11. remoteControl.Implementor = new ChangHong();
  12. remoteControl.On();
  13. remoteControl.SetChannel();
  14. remoteControl.Off();
  15. Console.WriteLine();
  16.  
  17. // 三星牌电视机
  18. remoteControl.Implementor = new Samsung();
  19. remoteControl.On();
  20. remoteControl.SetChannel();
  21. remoteControl.Off();
  22. Console.Read();
  23. }
  24. }

四、设计模式分析

优点:   1、抽象和实现的分离。

    2、优秀的扩展能力。

    3、实现细节对客户透明。

缺点:桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程

点击下载源码

设计模式のBridgePattern(桥接模式)----结构模式的更多相关文章

  1. 设计模式のCompositePattern(组合模式)----结构模式

    一.产生背景 又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式,它创建了对象组的树形结构. 这种模 ...

  2. 八、桥接模式--结构模式(Structural Pattern)

    桥梁模式:将抽象化(Abstraction)与实现化 (Implementation)脱耦,使得二者可以独立地变化. 桥梁模式类图: 抽象化(Abstraction)角色:抽象化给出的定义,并保存 一 ...

  3. 十二、享元(Flyweight)模式--结构模式(Structural Pattern)

    Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级".这里使用"享元 模式"更能反映模式的用意. 享元模式以共享 ...

  4. 九、 合成(Composite)模式 --结构模式(Structural Pattern)

    合成模式:有时又叫做部分-整体模式(Part-Whole).合成模式将对象组织到树结构中,可以用来描述整体与部分的关系.合成模式可以使客户端将单纯元素与复合元素同等看待. 合成模式分为安全式和透明式 ...

  5. 七、适配器(Adapter)模式--结构模式(Structural Pattern)

    适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作. 类的 Adapter模式的结构: 类适配器类图: 由图中可以看出,Adaptee ...

  6. 十一、外观(Facade)模式--结构模式(Structural Pattern)

    外部与一个子系统的通信必须通过一个统一的门面(Facade)对象进行,这就是门面模式.门面模式要求一个子系统的外部与其内部的通信必须通过一个统一的门面(Facade)对象进行. 门面模式提供一个高层次 ...

  7. 十、装饰(Decorator)模式 --结构模式(Structural Pattern)

    装饰(Decorator)模式又名包装(Wrapper)模式[GOF95].装饰模式以对客户端透明的方 式扩展对象的功能,是继承关系的一个替代方案. 装饰模式类图: 类图说明: 抽象构件(Compon ...

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

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

  9. php设计模式(二):结构模式

    上一篇我们介绍了设计模式的特性并且详细讲解了4种创建型模式,创建型模式是负责如何产生对象实例的,现在我们继续来给大家介绍结构型模式. 一.什么是结构型模式? 结构型模式是解析类和对象的内部结构和外部组 ...

  10. C#设计模式之八桥接模式(Bridge)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第二个模式,该模式是[桥接模式],也有叫[桥模式]的.大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称猜肯定是连接什么东西的.因为桥在我们现实 ...

随机推荐

  1. Android Studio 杀掉当前进程

    android.os.Process.killProcess( android.os.Process.myPid());

  2. Netty实战五之ByteBuf

    网络数据的基本单位总是字节,Java NIO 提供了ByteBuffer作为它的字节容器,但是其过于复杂且繁琐. Netty的ByteBuffer替代品是ByteBuf,一个强大的实现,即解决了JDK ...

  3. jdk的配置(适用于win7、win8、win10)

    一.前言 win7和win8的jdk配置基本一样,所以本文以win7和win10来说明配置. 二.win7jdk环境配置(win8和这个一样) 首先安装好jdk,这里已安装好jdk7,本文采取的是jd ...

  4. 6、两个数组的交集 II

    6.两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: n ...

  5. python使用tcp实现一个简单的下载器

    上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识. 文件下载器的流程如下: 客户端: 输入目标服务器的ip和port 输入要下载文件的名称 从服务器下载文件保存到本地 ...

  6. elasticsearch概念

    1.elasticsearch的核心概念 (1)Near Realtime(NRT):近实时,从写入数据到数据可以被搜索到有一个小延迟(大概1秒):基于es执行搜索和分析可以达到秒级 (2)Clust ...

  7. vue+vuecli+webapck2项目配置文件详解

    1.文件结构 ├─build │ ├─build.js │ ├─check-versions.js │ ├─dev-client.js │ ├─dev-server.js │ ├─utils.js │ ...

  8. Cesium-知识点(Viewer)

    Cesium之Viewer的构造(转自:https://blog.csdn.net/zhy905692718/article/details/78865107) Viewer属于Cesium的控件部分 ...

  9. 26.Odoo产品分析 (三) – 人力资源板块(6) – 工资表(2)

    查看Odoo产品分析系列--目录 接上一篇Odoo产品分析 (三) – 人力资源板块(6) – 工资表(1) 4. 缴纳登记册 在"缴纳登记册"菜单中可以查看所有的登记册并新建:  ...

  10. Javascript 对象 - 字符串对象

    字符串对象 字符串对象是JavaScript中比较常见的一种基本数据类型,他封装了一个字符串,并且提供了相应的方法.例如连接字符串.取字符串.分割字符串等.JavaScript中字符串是不可变的,原始 ...