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

前言

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

桥接模式介绍

1、来由

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

2、意图

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

3、案例图

 

 

 

4、桥接模式代码示例

  看上面案例图显示,咱们能够知道桥接模式包括如下部分:设计模式

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

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

3、实现化角色:这个角色给出实现化角色的接口,但不具体实现。这个 角色与抽象化角色不必定须要相同。相反能够彻底不一样。至关于抽象化 角色对应的是一个维度,而实现化角色对应的是第二个维度。
4、具体实现化角色:扩展实现实现化角色
函数

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

   

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、使用场景

一、若是系统须要在抽象化角色和实现化角色之间构建增长一些灵活性,避免采用继承类的形式。能够采用桥接模式创建关联关系spa

二、若是系统不但愿采用继承形式或者继承形式会致使系统极为复杂,能够考虑采用桥接模式设计

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

2、优势

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

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

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

3、缺点

一、增长了系统的理解难度及设计难度

总结

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

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

 

    C#设计模式系列目录

欢迎你们扫描下方二维码,和我一块儿踏上设计模式的闯关之路吧!

  

相关文章
相关标签/搜索