首页 > 其他分享 >【23种设计模式】桥接模式(七)

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

时间:2023-09-05 16:11:35浏览次数:38  
标签:implementor 23 桥接 数据库 实现 版本 设计模式 public

前言

桥接模式】是【结构型】设计模式的第二个模式,也有叫【桥模式】的,英文名称: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

桥接设计模式的优缺点

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

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

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

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

标签:implementor,23,桥接,数据库,实现,版本,设计模式,public
From: https://www.cnblogs.com/wml-it/p/17679918.html

相关文章

  • 2023.9 做题记录
    虽然第一天是8.31,但确实是开学第一个月,就一块算进去了。P2824法一:二分答案,将大于等于\(mid\)的数设为\(1\),小于的设为\(0\),最后位置上如果是\(1\)说明大于等于\(mid\),否则小于,时间复杂度\(O(n\logn)\),空间复杂度线性。法二(待做):线段树分裂,时间复杂度和空间复杂度均......
  • 接下来做的一些事20230905
    上一篇后缀自动机。数论。凸包。卷积。平衡树。圆方树。会尝试像\(6\)月的某段时间一样对自己做的每道题写一句话题解,以及评分。分数等级分为easy,easy+,medium,hard,hard+。每一档的意思为:easy自己能轻松做出来easy+自己花了一定功夫才能做出来medium会有些步骤......
  • 2023暑假集训总结-zxy
      在这个暑假集训期间,我度过了充实而有意义的日子,尽管没有很大的进步,也算是有些收获。 在集训中,我阅读完了老师曾经推荐的一本较为简单的数据结构的书,虽然我没有举一反三的能力,但也使我对数据结构有了初步的了解和认识。写题还是照样写不出来,但好像不像以往那样一头雾水了,是......
  • 2023暑假集训总结-lzg
    本人有幸成为程序设计基础暑期集训中的一员,在经历了长达两个月的集训后,我从中收获了很多。    首先是在集训中我学习到了很多知识,在这两个月里,我先是听了一部分ACwing上的课,学到了很多新的算法知识,不过现在掌握的还是相当不熟练。其次为了熟练运用新学到的知识我也在牛......
  • 2023暑假集训总结-wmh
    经过一个多月的集训,我对于基础算法有了系统而全面的认识和学习。在训练前,遇到问题时我只会通过模拟或是靠自己思考来解决题目,经过这次系统性的学习后,我能够通过题目猜出来解决问题所需要的知识点或是大概思路,相较于之前的一窍不通有了很大的提升。在集训中,主要学习了acwing上的算......
  • 2023暑假集训总结-mjh
       在近40天的暑假集训时间内,比赛方面主要是通过牛客上萌新联赛和杭电多校联赛进行练习,偶尔会打cf。日常刷题方面主要是通过洛谷上的官方题单进行练习。首先从日常写题来说,通过洛谷的官方题单,可以对相同类型的题目进行集中训练,对于基础算法:前缀,差分,二分,搜索,快速幂,并查......
  • 2023暑假集训总结-wh
    在7.10-8.18得集训日子中,我们参加了很多比赛和练习,主要是航电多校,Acwing得系统刷题和cf的日常比赛。其实大部分时间都是在打比赛,因为航电多校一周两场+cf+acwing周赛差不多一天一场,所以每日比赛还是很舒服的,比完赛在补个题。基本上是这个节奏。其实航电多校我们是非常坐牢的,......
  • 2023暑假集训总结-crf
    暑假集训从七月十号到八月18号,在这段期间的我参与的主要活动有牛客的萌新赛,杭电多校,acwing上的课程学习和刷题联系,codeforecs的比赛和补题。先说acwing,集训的前期我把时间投入到了acwing上,acwing上的课确实起到了作用,让我不用迷茫下一步应该学什么,按部就班地学习知识点,同时写一些......
  • C/C++地铁线路查询系统[2023-09-05]
    C/C++地铁线路查询系统[2023-09-05]地铁线路查询问题描述:当一个用户从甲地到乙地时,由于不同需求,就有不同的交通路线,有人希望以最短距离到达,有人希望用最少的换乘次数等。请编写一北京地铁线路查询系统,通过输入起始站、终点站,为用户提供两种或以上决策的交通咨询。设计要求:......
  • C/C++《程序设计(上机)》选题[2023-09-05]
    C/C++《程序设计(上机)》选题[2023-09-05]2023-2024-1《程序设计(上机)》授课计划开发工具:TurboC/Visualstudio等等具体要求:用上述系统平台和开发工具完成所分配题目的程序,并撰写报告。一、课程任务概述本课程是学生在学习了C或C++等编程语言之后进行的一次实践性学习,通过......