前言

  今天讲解的是结构型设计模式中的第二种——桥接模式。桥接——是指依据OSI <https://baike.baidu.com/item/OSI/5520>
网络模型 <https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E6%A8%A1%E5%9E%8B/239980>的
链路层 <https://baike.baidu.com/item/%E9%93%BE%E8%B7%AF%E5%B1%82/10624635>的地址,对网络
数据包 <https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E5%8C%85/489739>进行转发的过程,工作在
OSI <https://baike.baidu.com/item/OSI/5520>的第二层。一般的交换机
<https://baike.baidu.com/item/%E4%BA%A4%E6%8D%A2%E6%9C%BA/103532>,网桥
<https://baike.baidu.com/item/%E7%BD%91%E6%A1%A5/99310>
就有桥接作用。这是百科解释。那么今天讲的桥接模式是什么呢?桥接是一个纽带,近年的港珠澳大桥。就充当起三地连接的纽带。那么在设计模式中的桥接模式呢?也是一样,其中组成也是通过桥接、纽带连接。然后组合成所需要的东西的。我们具体看看其桥接模式的具体意义吧。

桥接模式介绍

一、来由


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

二、意图

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

三、案例图

 

 

 

四、桥接模式代码示例

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

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

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

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


  我们看这么一个案例。世人皆知手机有安卓和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#设计模式系列目录 <https://www.cnblogs.com/hulizhong/p/11394686.html>

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