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

设计模式,桥接,模式 · 浏览次数 : 352

小编点评

**桥接模式** **定义:** 桥接模式是连接了两个不同维度的东西,而且这两个维度又有经常变化的模式。 **组成部分:** * **抽象化角色 (Abstraction):**抽象化给出的定义,并保存一个对实现化对象 (Implementor) 的引用。 * **修正抽象化角色 (Refined Abstraction):**扩展抽象化角色,改变和修正父类对抽象化的定义。 * **实现化角色 (Implementor):**这个角色给出实现化角色的接口,但不给出具体的实现。 * **具体实现化角色 (Concrete Implementor):**这个角色给出实现化角色接口的具体实现。 **优点:** * 减少复杂性。 * 促进抽象化角色和实现化角色的解耦。 * 允许针对不同的实现进行扩展。 **缺点:** * 增加了系统的复杂度。 * 可能会引入额外的复杂性,例如接口定义。 **应用场景:** * 当需要连接两个维度时。 * 当需要对抽象化角色和实现化角色进行扩展时。 * 当要提供不同的实现来满足不同的需求时。 **数据库示例:** 桥接模式可以用在数据库设计中,例如: * **SqlServer2000 数据库:** 一个抽象接口,它定义了数据库的创建方法。 * **SqlServer2005 数据库:** 一个具体实现化角色,它实现了数据库的创建方法。 **结论:** 桥接模式是一种设计模式,它可以用来将抽象化角色与实现化角色分离,从而减少系统的复杂度。

正文

前言

桥接模式】是【结构型】设计模式的第二个模式,也有叫【桥模式】的,英文名称:Bridge Pattern

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

桥接设计模式的定义

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

桥接设计模式的组成

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

image

(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

 /// <summary>
    /// 该抽象类就是抽象接口的定义,该类型就相当于是Abstraction类型
    /// </summary>
    public abstract class Database
    {
        //通过组合方式引用平台接口,此处就是桥梁,该类型相当于Implementor类型
        protected PlatformImplementor _implementor;

        //通过构造器注入,初始化平台实现
        protected Database(PlatformImplementor implementor)
        {
            this._implementor = implementor;
        }

        //创建数据库--该操作相当于Abstraction类型的Operation方法
        public abstract void Create();
    }

SqlServer2000版本的数据库继承

 /// <summary>
    /// SqlServer2000版本的数据库,相当于RefinedAbstraction类型
    /// </summary>
    public class SqlServer2000 : Database
    {
        //构造函数初始化
        public SqlServer2000(PlatformImplementor implementor) : base(implementor) { }

        public override void Create()
        {
            this._implementor.Process();
        }
    }

SqlServer2005版本的数据库继承

 /// <summary>
    /// SqlServer2005版本的数据库,相当于RefinedAbstraction类型
    /// </summary>
    public class SqlServer2005 : Database
    {
        //构造函数初始化
        public SqlServer2005(PlatformImplementor implementor) : base(implementor) { }

        public override void Create()
        {
            this._implementor.Process();
        }
    }
平台定义与实现
 /// <summary>
    /// 该抽象类就是实现接口的定义,该类型就相当于是Implementor类型
    /// </summary>
    public abstract class PlatformImplementor
    {
        //该方法就相当于Implementor类型的OperationImpl方法
        public abstract void Process();
    }

    /// <summary>
    /// SqlServer2000版本的数据库针对Unix操作系统具体的实现,相当于ConcreteImplementorA类型
    /// </summary>
    public class SqlServer2000UnixImplementor : PlatformImplementor
    {
        public override void Process()
        {
            Console.WriteLine("SqlServer2000针对Unix的具体实现");
        }
    }

    /// <summary>
    /// SqlServer2005版本的数据库针对Unix操作系统的具体实现,相当于ConcreteImplementorB类型
    /// </summary>
    public sealed class SqlServer2005UnixImplementor : PlatformImplementor
    {
        public override void Process()
        {
            Console.WriteLine("SqlServer2005针对Unix的具体实现");
        }
    }
调用
  /// <summary>
        /// 测试方法
        /// </summary>
        public void RunTest()
        {
            PlatformImplementor SqlServer2000UnixImp = new SqlServer2000UnixImplementor();
            //还可以针对不同平台进行扩展,也就是子类化,这个是独立变化的
            Database SqlServer2000Unix = new SqlServer2000(SqlServer2000UnixImp);
            //数据库版本也可以进行扩展和升级,也进行独立的变化。
            //以上就是两个维度的变化。
            //就可以针对Unix执行操作了
            SqlServer2000Unix.Create();
        }

image

桥接设计模式的优缺点

优点
  • 把抽象接口与其实现解耦。

  • 抽象和实现可以独立扩展,不会影响到对方。

  • 对客户隐藏了具体实现细节。

缺点
  • 增加了系统的复杂度

与【23种设计模式】桥接模式(七)相似的内容:

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

## 前言 【**桥接模式**】是【**结构型**】设计模式的第二个模式,也有叫【桥模式】的,英文名称:**Bridge Pattern**。 大家第一次看到这个名称会想到什么呢?我第一次看到这个模式根据名称猜肯定是连接什么东西的。因为桥在我们现实生活中经常是连接着A地和B地,再往后来发展,桥引申为

【23种设计模式】适配器模式(六)

## 前言 从今天开始我们开始讲【结构型】设计模式,【结构型】设计模式有如下几种:**适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式、代理模式**。【创建型】的设计模式解决的是对象创建的问题,那【结构型】设计模式解决的是类和对象的组合关系的问题。 今天我们就开始讲【结构型】设计模式里面

【23种设计模式】设计模式综述(开篇)

## 一、设计模式概述: ​ **设计模式(Design pattern)**代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。是一套被反复使用的、多

【23种设计模式】单例模式(一)

## 前言: 单例模式是创建型模式5种中的第1种,**关注对象的创建, 保证一个类仅有一个实例,并且提供一个全局访问点**。在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。如何绕过常规的构造器,提供一种机制来保证一个类只创建一个实例

【23种设计模式】工厂方法模式(二)

## 前言 在讲述之工厂方法模式前,我们来先了解简单工厂模式,简单工厂模式是最简单的设计模式之一,它虽然不属于GoF的23种设计模式,但是应用也较为频繁,同时它也是学习其他创建型模式的基础。下面我们来先了解下简单工厂模式,然后针对它的缺点来引出工厂方法模式。 ## 简单工厂模式定义 **简单工厂模式

【23种设计模式】抽象工厂模式(三)

## 前言 在抽象工厂模式开篇之前,我们先思考一个问题,如果我们要设计一套房子,其他的组件暂时不考虑,我们仅仅考虑房顶、地板、窗户、房门进行设计。什么样的风格暂时未知,可能会有很多种类。可以先设计一套古典风格的房子,再设计一套现代风格的房子,再设计一套欧式风格的房子....这么多套房子需要设计,需求

【23种设计模式】建造者模式(四)

## 前言 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中

【23种设计模式】原型模式(五)

## 前言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这就会增加创建类的复杂度和创建过程与客户代码复杂的耦合度。如果采用工厂模式来创建这样的实例对象的话,随着产品类的不断增加,导致子类的数量不断增多,也导致了相

【23种设计模式】组合模式(八)

前言 组合模式,英文名称是:Composite Pattern。当我们谈到这个模式的时候,有一个物件和这个模式很像,也符合这个模式要表达的意思,那就是“俄罗斯套娃”。“俄罗斯套娃”就是大的瓷器娃娃里面装着一个小的瓷器娃娃,小的瓷器娃娃里面再装着更小的瓷器娃娃,直到最后一个不能再装更小的瓷器娃娃的那个

【23种设计模式】装饰模式(九)

前言 装饰模式,英文名称:Decorator Pattern。我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理解吧,大家一定要看清楚,是“装修”,不是“装饰”。在房子装修的过程中,各种功能可以相互组合,来增加房子的功用。类似的,如果我们在软件系统中,要给某个类型或者对象增加