zoukankan      html  css  js  c++  java
  • 通俗易懂设计模式解析——桥接模式

    前言

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

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

      

  • 相关阅读:
    二级域名绑定子目录
    Promise.all的使用
    react的状态管理
    chrome调试
    组件之间通讯
    promise-async-await
    深入理解AMQP协议转载
    java中堆栈(stack)和堆(heap)
    面试题(Spring)
    IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别参考
  • 原文地址:https://www.cnblogs.com/hulizhong/p/11448067.html
Copyright © 2011-2022 走看看