通俗易懂设计模式解析——桥接模式

  • 2019 年 10 月 3 日
  • 筆記

前言

  今天讲解的是结构型设计模式中的第二种——桥接模式。桥接——是指依据OSI网络模型链路层的地址,对网络数据包进行转发的过程,工作在OSI的第二层。一般的交换机网桥就有桥接作用。这是百科解释。那么今天讲的桥接模式是什么呢?桥接是一个纽带,近年的港珠澳大桥。就充当起三地连接的纽带。那么在设计模式中的桥接模式呢?也是一样,其中组成也是通过桥接、纽带连接。然后组合成所需要的东西的。我们具体看看其桥接模式的具体意义吧。

桥接模式介绍

一、来由

  在我们面对系统程序开发设计的时候,有时候会面临着一些类会存在两个维度的变化,在有多种可能会变化的情况下,用继承会造成较为复杂的程序后果、扩展起来不那么灵活。那么如何去面对多个角度的分类并且多个角度都可能变化的情况呢?这就需要桥接模式了。

二、意图

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

三、案例图

 

 

 

四、桥接模式代码示例

  看上面案例图显示,我们可以知道桥接模式包括以下部分:

一、抽象化角色:抽象化给出定义,包含一个对实现化对象的引用

二、具体抽象化角色:扩展实现抽象化角色

三、实现化角色:这个角色给出实现化角色的接口,但不具体实现。这个 角色与抽象化角色不一定需要相同。相反可以完全不同。相当于抽象化 角色对应的是一个维度,而实现化角色对应的是第二个维度。
四、具体实现化角色:扩展实现实现化角色

  我们看这么一个案例。世人皆知手机有安卓和IOS类型。那么对于软件来说也是需要适配两种类型的。同时呢软件也是在不断迭代更新的。就这样而言。对于一个手机软件。我们暂且看两个维度。一、迭代更新版本。二、适用于手机类型。如果采用继承的方式解决此类型问题将会大大的加大系统的复杂度。这里我们就可以采用桥接模式。我们一起看看代码如何实现其设计的吧:

   

namespace Bridge_Pattern  {      class BridgePattern      {      }      #region  抽象化角色——迭代更新的版本(包含对实现化角色对象的引用)========      public abstract class Version      {          /// <summary>          /// 实现对实现化对象的引用,通过组合实现软件迭代更新并适用于不同平台的功能          /// </summary>          protected PhoneType _phoneType;            /// <summary>          /// 构造函数注入,实现化对象的初始化          /// </summary>          /// <param name="phoneType"></param>          public Version(PhoneType phoneType)          {              this._phoneType = phoneType;          }          /// <summary>          /// 创建软件版本          /// </summary>          public abstract void Create();      }      #endregion        #region 实现化角色——适用于手机类型=============================================      public abstract class PhoneType      {          /// <summary>          /// 适配手机类型          /// </summary>          public abstract void SetType();      }      #endregion        #region 具体抽象化角色——具体实际迭代更新的版本===========      /// <summary>      /// 版本1.0      /// </summary>      public class OneVersion : Version      {          public OneVersion(PhoneType phoneType) :base(phoneType)          {          }          public override void Create()          {              Console.WriteLine("当前版本1.0");              this._phoneType.SetType();          }      }      /// <summary>      /// 当前版本2.1      /// </summary>      public class TwoVersion : Version      {          public TwoVersion(PhoneType phoneType) : base(phoneType) { }          public override void Create()          {              Console.WriteLine("当前版本2.0");              this._phoneType.SetType();          }      }      #endregion        #region  具体实现化角色——具体实际使用类型===================      /// <summary>      /// 安卓系统      /// </summary>      public class AndroidPhoneType : PhoneType      {          public override void SetType()          {              Console.WriteLine("当前是Android类型");          }      }        /// <summary>      /// ios系统      /// </summary>      public class IOSPhoneType : PhoneType      {          public override void SetType()          {              Console.WriteLine("当前是IOS类型");          }      }      #endregion    }

 

    class Program      {          static void Main(string[] args)          {              ///1.0版本软件 安卓系统               AndroidPhoneType androidPhoneType = new AndroidPhoneType();              OneVersion oneVersion = new OneVersion(androidPhoneType);              oneVersion.Create();                ///2.0 版本软件  IOS系统              IOSPhoneType iOSPhoneType = new IOSPhoneType();              TwoVersion twoVersion = new TwoVersion(iOSPhoneType);              twoVersion.Create();                Console.ReadLine();          }      }

 

使用场景及优缺点

一、使用场景

1、如果系统需要在抽象化角色和实现化角色之间构建增加一些灵活性,避免采用继承类的形式。可以采用桥接模式建立关联关系

2、如果系统不希望采用继承形式或者继承形式会导致系统极为复杂,可以考虑采用桥接模式

3、如果一个类存在两个维度,且两个维度都常变化扩展,使用桥接模式再适合不过了

二、优点

1、将抽象接口与实现解耦分离

2、抽象与实现相互分离,易扩展

3、实现的细节对用户透明

三、缺点

1、增加了系统的理解难度及设计难度

总结

  桥接模式。意如其名。就是将一个类中两个维度进行分离开来。将抽象接口与实现解耦。然后通过组合桥接关联在一起。组合使用。其两个对象都是抽象,然后其子类具体实践。由抽象接口对实现化角色的对象的引用来关联。桥接模式适合用于两个维度常变化的类。把多角度分离出来,然后让他们独立变化,减少耦合。

     天再高又怎样,踮起脚尖就更接近阳光。

 

    C#设计模式系列目录

欢迎大家扫描下方二维码,和我一起踏上设计模式的闯关之路吧!