C#设计模式之八桥接模式(Bridge)【结构型】

2021-05-04 18:28

阅读:764

标签:override   组成   实现类   cte   eal   ogr   介绍   sum   完全   

一、引言

   今天我们要讲【结构型】设计模式的第二个模式,该模式是【桥接模式】,也有叫【桥模式】的。大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称猜肯定是连接什么东西的。因为桥在我们现实生活中经常是连接着A地和B地,再往后来发展,桥引申为一种纽带,比如:丝绸之路是连接亚洲和欧洲的桥梁。有了桥,我们出行方便了,从一个地方到另一个地方在有桥的情况更方便了(此处不许抬杠,当然是需要桥的情况)。桥是针对桥的使用环境来说的,解决了跨越和衔接的问题。在设计模式中的【桥模式】也有类似的概念,是连接了两个不同维度的东西,而且这两个维度又有强烈的变化,什么叫强烈呢,经常变化,什么是经常呢?哈哈,自己理解吧。

二、桥接模式的详细介绍

2.1、动机(Motivate)

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

2.2、意图(Intent)

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

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

2.3、结构图

       技术分享

2.4、模式的组成

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

  . Abstraction:定义抽象类的接口,它维护了一个指向Implementor类型对象的指针。

  . RefinedAbstraction:扩充由Abstraction定义的接口;

  . Implementor:定义实现类的接口,该接口不一定要与Abstraction的接口完全一致,事实上两个接口可以完全不同。一般情况,Implementor接口仅为提供基本操作,而Abstraction则定义了基于基本操作的较高层次操作。

  . ConcreteImplementorA和ConcreteImplementorB:实现Implementor接口并定义它的具体实现。

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

2.5 、桥接模式的具体实现

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

 1 namespace 桥接模式的实现
 2 {
 3     /// 
 4     /// 该抽象类就是抽象接口的定义,该类型就相当于是Abstraction类型
 5     /// 
 6     public abstract class Database
 7     {
 8         //通过组合方式引用平台接口,此处就是桥梁,该类型相当于Implementor类型
 9         private 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     /// 
22     /// 该抽象类就是实现接口的定义,该类型就相当于是Implementor类型
23     /// 
24     public abstract class PlatformImplementor
25     {
26        //该方法就相当于Implementor类型的OperationImpl方法
27        public abstract void Process();
28     }
29  
30     /// 
31     /// SqlServer2000版本的数据库,相当于RefinedAbstraction类型
32     /// 
33     public class SqlServer2000:Database
34     {
35         public override void Create()
36         {
37             this._implementor.Process();
38         }
39     }
40  
41     /// 
42     /// SqlServer2005版本的数据库,相当于RefinedAbstraction类型
43     /// 
44     public class SqlServer2005:Database
45     {
46         public override void Create()
47         {
48             this._implementor.Process();
49         }
50     }
51 
52    /// 
53     /// SqlServer2000版本的数据库针对Unix操作系统具体的实现,相当于ConcreteImplementorA类型
54     /// 
55     public class SqlServer2000UnixImplementor:PlatformImplementor
56     {
57         public override void Process()
58         {
59             //SqlServer2000针对Unix的具体实现;
60         }
61     }
62  
63     /// 
64     /// SqlServer2005版本的数据库针对Unix操作系统的具体实现,相当于ConcreteImplementorB类型
65     /// 
66     public sealed class SqlServer2005UnixImplementor:PlatformImplementor
67     {
68         public override void Process()
69         {
70             //SqlServer2005针对Unix的具体实现;
71         }
72     }
73 
74    public class Program
75    {
76       static void Main()
77       {
78          PlatformImplementor SqlServer2000UnixImp=new SqlServer2000UnixImplementor();
79          //还可以针对不同平台进行扩展,也就是子类化,这个是独立变化的
80 
81          Database SqlServer2000Unix=new SqlServer2000(SqlServer2000UnixImp);
82          //数据库版本也可以进行扩展和升级,也进行独立的变化。
83 
84          以上就是两个维度的变化。
85 
86          //就可以针对Unix执行操作了
87          SqlServer2000Unix.Create();
88       }
89    }
90 }

    代码都很简单,也有详细的备注,就不多说了。

三、桥接模式的实现要点:
    
    1.Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。

    2.所谓抽象和实现沿着各自维度的变化,即“子类化”它们,得到各个子类之后,便可以任意组合它们,从而获得不同平台上的不同型号。

    3.Bridge模式有时候类似于多继承方案,但是多继承方案往往违背了类的单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。

    4.Bridge模式的应用一般在“两个非常强的变化维度”,有时候即使有两个变化的维度,但是某个方向的变化维度并不剧烈——换言之两个变化不会导致纵横交错的结果,并不一定要使用Bridge模式。

四、.NET 中桥接模式的实现

    学习中。。。,如果谁有好的代码分享,也可以贴出来。

五、总结

  今天的文章就写到这里了,现在小结一下。桥接模式它是连接客户端代码和具体实现代码的一座桥梁,同时它也隔离了实现代码的改变对客户代码的影响。在【意图】中所说的抽象和实现,这两个部分其实都是高度抽象的,前面“抽象”是指定义的针对客户端的接口,客户端其实使用的是Abstract类型或者是RefinedAbstract类型,这两个类型只是接口,具体的实现委托给了Implementor类型了,Abstract类型子类化的扩展也演变成Implementor子类化的变化。我个人的理解,Abstract类型和其子类型在客户端代码和真正实现的代码之间起到了桥梁的作用,隔离了Implementor实现代码的变化,让客户端更稳定,所以【意图】才说是讲抽象部分和它的实现部分隔离。大家好好理解一下吧,刚开始有点绕。

C#设计模式之八桥接模式(Bridge)【结构型】

标签:override   组成   实现类   cte   eal   ogr   介绍   sum   完全   

原文地址:http://www.cnblogs.com/PatrickLiu/p/7699301.html


评论


亲,登录后才可以留言!