3.Bridge模式有时候类似于多继承方案

时间:2022-06-06 06:38:25

原文:C#设计模式之七桥接模式(Bridge Pattern)【布局型】

一、引言

   今天我们要讲【布局型】设计模式的第二个模式,该模式是【桥接模式】,也有叫【桥模式】的,英文名称:Bridge Pattern。大家第一次看到这个名称会想到什么呢?我第一次看到这个模式按照名称猜必定是连接什么对象的。因为桥在我们现实生活中经常是连接着A地和B地,再往后来成长,桥引申为一种纽带,好比:丝绸之路是连接亚洲和欧洲的桥梁。有了桥,我们出行便利了,从一个处所到另一个处地址有桥的情况更便利了(此处不许抬杠,固然是需要桥的情况)。桥是针对桥的使用环境来说的,解决了跨越和跟尾的问题。在设计模式中的【桥模式】也有类似的观点,是连接了两个差别维度的对象,而且这两个维度又有强烈的变革,什么叫强烈呢,经常变革,什么是经常呢?哈哈,本身理解吧。

二、桥接模式的详细介绍

2.1、动机(Motivate)

   在很多游戏场景中,会有这样的情况:【装备】自己会有的本身固有的逻辑,好比枪支,会有型号的问题,同时此刻很多的游戏又在差此外介质平台上运行和使用,这样就使得游戏的【装备】具有了两个变革的维度——一个变革的维度为“平台的变革”,另一个变革的维度为“型号的变革”。如果我们要写代码实现这款游戏,难道我们针对每种平台都实现一套独立的【装备】吗?复用在哪里?如何应对这种“多维度的变革”?如何操作面向东西技术来使得【装备】可以轻松地沿着“平台”和“型号”两个标的目的变革,而不引入特别的庞大度?

2.2、意图(Intent)

   将抽象部分与实现部分疏散,使它们都可以独登时变革。                                                                  --《设计模式》Gof

   桥模式不能只是认为是抽象和实现的疏散,它其实并不只限于此。其实两个都是抽象的部分,更确切的理解,应该是将一个事物中多个维度的变革疏散

2.3、布局图(Structure)

      

3.Bridge模式有时候类似于多继承方案



2.4、模式的构成

      桥接模式的布局包孕Abstraction、RefinedAbstraction、Implementor、ConcreteImplementorA和ConcreteImplementorB五个部分,此中:

       (1)、抽象化角色(Abstraction):抽象化给出的界说,并生存一个对实现化东西(Implementor)的引用。

       (2)、修正抽象化角色(Refined Abstraction):扩展抽象化角色,转变和修正父类对抽象化的界说。

       (3)、实现化角色(Implementor):这个角色给出实现化角色的接口,但不给出具体的实现。必需指出的是,这个接口不必然和抽象化角色的接口界说不异,实际上,这两个接口可以非常不一样。实现化角色该当只给出底层操纵,而抽象化角色该当只给出基于底层操纵的更高一层的操纵。

       (4)、具体实现化角色(Concrete Implementor):这个角色给出实现化角色接口的具体实现。

  在桥接模式中,两个类Abstraction和Implementor分袂界说了抽象与行为类型的接口,通过挪用两接口的子类实现抽象与行为的动态组合。

2.5 、桥接模式的具体代码实现

   今天我们就以数据库为例来写该模式的实现。每种数据库都有本身的版本,但是每种数据库在差此外平台上实现又是不一样的。好比:微软的SqlServer数据库,该数据库它有2000版本、2005版本、2006版本、2008版本,后面还会有更新的版本。并且这些版本都是运行在Windows操纵系统下的,如果要供给Lunix操纵系统下的SqlServer怎么办呢?如果又要供给IOS操纵系统下的SqlServer数据库该怎么办呢?这个情况就可以使用桥接模式,也就是Brige模式。我们就来看看具体的实现吧! 

1 namespace 桥接模式的实现 2 { 3 /// <summary> 4 /// 该抽象类就是抽象接口的界说,该类型就相当于是Abstraction类型 5 /// </summary> 6 public abstract class Database 7 { 8 //通过组合方法引用平台接口,此处就是桥梁,该类型相当于Implementor类型 9 protected PlatformImplementor _implementor; 10 11 //通过结构器注入,初始化平台实现 12 protected Database(PlatformImplementor implementor) 13 { 14 this._implementor = implementor; 15 } 16 17 //创建数据库--该操纵相当于Abstraction类型的Operation要领 18 public abstract void Create(); 19 } 20 21 /// <summary> 22 /// 该抽象类就是实现接口的界说,该类型就相当于是Implementor类型 23 /// </summary> 24 public abstract class PlatformImplementor 25 { 26 //该要领就相当于Implementor类型的OperationImpl要领 27 public abstract void Process(); 28 } 29 30 /// <summary> 31 /// SqlServer2000版本的数据库,相当于RefinedAbstraction类型 32 /// </summary> 33 public class SqlServer2000 : Database 34 { 35 //结构函数初始化 36 public SqlServer2000(PlatformImplementor implementor) : base(implementor) { } 37 38 public override void Create() 39 { 40 this._implementor.Process(); 41 } 42 } 43 44 /// <summary> 45 /// SqlServer2005版本的数据库,相当于RefinedAbstraction类型 46 /// </summary> 47 public class SqlServer2005 : Database 48 { 49 //结构函数初始化 50 public SqlServer2005(PlatformImplementor implementor) : base(implementor) { } 51 52 public override void Create() 53 { 54 this._implementor.Process(); 55 } 56 } 57 58 /// <summary> 59 /// SqlServer2000版本的数据库针对Unix操纵系统具体的实现,相当于ConcreteImplementorA类型 60 /// </summary> 61 public class SqlServer2000UnixImplementor : PlatformImplementor 62 { 63 public override void Process() 64 { 65 Console.WriteLine("SqlServer2000针对Unix的具体实现"); 66 } 67 } 68 69 /// <summary> 70 /// SqlServer2005版本的数据库针对Unix操纵系统的具体实现,相当于ConcreteImplementorB类型 71 /// </summary> 72 public sealed class SqlServer2005UnixImplementor : PlatformImplementor 73 { 74 public override void Process() 75 { 76 Console.WriteLine("SqlServer2005针对Unix的具体实现"); 77 } 78 } 79 80 public class Program 81 { 82 static void Main() 83 { 84 PlatformImplementor SqlServer2000UnixImp = new SqlServer2000UnixImplementor(); 85 //还可以针对差别平台进行扩展,也就是子类化,这个是独立变革的 86 87 Database SqlServer2000Unix = new SqlServer2000(SqlServer2000UnixImp); 88 //数据库版本也可以进行扩展和升级,也进行独立的变革。 89 90 //以上就是两个维度的变革。 91 92 //就可以针对Unix执行操纵了 93 SqlServer2000Unix.Create(); 94 } 95 } 96 }