前言

  今天讲解的是结构型设计模式中的第二种——桥接模式。桥接——是指依据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#设计模式系列目录

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

  

版权声明:本文为hulizhong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hulizhong/p/11448067.html