前言
今天讲解的是结构型设计模式中的第二种 -- 桥接模式. 桥接 -- 是指依据 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# 设计模式系列目录
欢迎大家扫描下方二维码, 和我一起踏上设计模式的闯关之路吧!
来源: https://www.cnblogs.com/hulizhong/p/11448067.html