翼度科技»论坛 编程开发 .net 查看内容

【23种设计模式】桥接模式(七)

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
前言

桥接模式】是【结构型】设计模式的第二个模式,也有叫【桥模式】的,英文名称:Bridge Pattern
大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称猜肯定是连接什么东西的。因为桥在我们现实生活中经常是连接着A地和B地,再往后来发展,桥引申为一种纽带,比如:丝绸之路是连接亚洲和欧洲的桥梁。桥是针对桥的使用环境来说的,解决了跨越和衔接的问题。在设计模式中的【桥模式】也有类似的概念,是连接了两个不同维度的东西,而且这两个维度又有经常的变化。
桥接设计模式的定义

在很多游戏场景中,会有这样的情况:【装备】本身会有的自己固有的逻辑,比如枪支,会有型号的问题,同时现在很多的游戏又在不同的介质平台上运行和使用,这样就使得游戏的【装备】具有了两个变化的维度:一个变化的维度为“平台的变化”,另一个变化的维度为“型号的变化”。如果我们要写代码实现这款游戏,难道我们针对每种平台都实现一套独立的【装备】吗?复用在哪里?如何应对这种“多维度的变化”?如何利用面向对象技术来使得【装备】可以轻松地沿着“平台”和“型号”两个方向变化,而不引入额外的复杂度?桥接模式就是将抽象部分与实现部分分离,使它们都可以独立地变化。
桥接设计模式的组成

桥接模式的结构包括Abstraction、RefinedAbstraction、Implementor、ConcreteImplementorA和ConcreteImplementorB五个部分,其中:

(1)抽象化角色(Abstraction):抽象化给出的定义,并保存一个对实现化对象(Implementor)的引用。
(2)修正抽象化角色(Refined Abstraction):扩展抽象化角色,改变和修正父类对抽象化的定义。
(3)实现化角色(Implementor):这个角色给出实现化角色的接口,但不给出具体的实现。必须指出的是,这个接口不一定和抽象化角色的接口定义相同,实际上,这两个接口可以非常不一样。实现化角色应当只给出底层操作,而抽象化角色应当只给出基于底层操作的更高一层的操作。
(4)具体实现化角色(Concrete Implementor):这个角色给出实现化角色接口的具体实现。
在桥接模式中,两个类Abstraction和Implementor分别定义了抽象与行为类型的接口,通过调用两接口的子类实现抽象与行为的动态组合。
桥接设计模式的实现

以数据库为例来写该模式的实现,每种数据库都有自己的版本,但是每种数据库在不同的平台上实现又是不一样的。比如:微软的SqlServer数据库,该数据库它有2000版本、2005版本、2006版本、2008版本,后面还会有更新的版本。并且这些版本都是运行在Windows操作系统下的,如果要提供Lunix操作系统下的SqlServer怎么办呢?如果又要提供IOS操作系统下的SqlServer数据库该怎么办呢?这个情况就可以使用桥接模式,也就是Brige模式
数据库类型定义与实现

抽象类DataBase
  1. /// <summary>
  2.     /// 该抽象类就是抽象接口的定义,该类型就相当于是Abstraction类型
  3.     /// </summary>
  4.     public abstract class Database
  5.     {
  6.         //通过组合方式引用平台接口,此处就是桥梁,该类型相当于Implementor类型
  7.         protected PlatformImplementor _implementor;
  8.         //通过构造器注入,初始化平台实现
  9.         protected Database(PlatformImplementor implementor)
  10.         {
  11.             this._implementor = implementor;
  12.         }
  13.         //创建数据库--该操作相当于Abstraction类型的Operation方法
  14.         public abstract void Create();
  15.     }
复制代码
SqlServer2000版本的数据库继承
  1. /// <summary>
  2.     /// SqlServer2000版本的数据库,相当于RefinedAbstraction类型
  3.     /// </summary>
  4.     public class SqlServer2000 : Database
  5.     {
  6.         //构造函数初始化
  7.         public SqlServer2000(PlatformImplementor implementor) : base(implementor) { }
  8.         public override void Create()
  9.         {
  10.             this._implementor.Process();
  11.         }
  12.     }
复制代码
SqlServer2005版本的数据库继承
  1. /// <summary>
  2.     /// SqlServer2005版本的数据库,相当于RefinedAbstraction类型
  3.     /// </summary>
  4.     public class SqlServer2005 : Database
  5.     {
  6.         //构造函数初始化
  7.         public SqlServer2005(PlatformImplementor implementor) : base(implementor) { }
  8.         public override void Create()
  9.         {
  10.             this._implementor.Process();
  11.         }
  12.     }
复制代码
平台定义与实现
  1. /// <summary>
  2.     /// 该抽象类就是实现接口的定义,该类型就相当于是Implementor类型
  3.     /// </summary>
  4.     public abstract class PlatformImplementor
  5.     {
  6.         //该方法就相当于Implementor类型的OperationImpl方法
  7.         public abstract void Process();
  8.     }
  9.     /// <summary>
  10.     /// SqlServer2000版本的数据库针对Unix操作系统具体的实现,相当于ConcreteImplementorA类型
  11.     /// </summary>
  12.     public class SqlServer2000UnixImplementor : PlatformImplementor
  13.     {
  14.         public override void Process()
  15.         {
  16.             Console.WriteLine("SqlServer2000针对Unix的具体实现");
  17.         }
  18.     }
  19.     /// <summary>
  20.     /// SqlServer2005版本的数据库针对Unix操作系统的具体实现,相当于ConcreteImplementorB类型
  21.     /// </summary>
  22.     public sealed class SqlServer2005UnixImplementor : PlatformImplementor
  23.     {
  24.         public override void Process()
  25.         {
  26.             Console.WriteLine("SqlServer2005针对Unix的具体实现");
  27.         }
  28.     }
复制代码
调用
  1.   /// <summary>
  2.         /// 测试方法
  3.         /// </summary>
  4.         public void RunTest()
  5.         {
  6.             PlatformImplementor SqlServer2000UnixImp = new SqlServer2000UnixImplementor();
  7.             //还可以针对不同平台进行扩展,也就是子类化,这个是独立变化的
  8.             Database SqlServer2000Unix = new SqlServer2000(SqlServer2000UnixImp);
  9.             //数据库版本也可以进行扩展和升级,也进行独立的变化。
  10.             //以上就是两个维度的变化。
  11.             //就可以针对Unix执行操作了
  12.             SqlServer2000Unix.Create();
  13.         }
复制代码

桥接设计模式的优缺点

优点


  • 把抽象接口与其实现解耦。
  • 抽象和实现可以独立扩展,不会影响到对方。
  • 对客户隐藏了具体实现细节。
缺点


  • 增加了系统的复杂度

来源:https://www.cnblogs.com/wml-it/archive/2023/09/05/17679918.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具