桥接模式

文章目录

  • 桥接模式
    • 模式分类
    • 模式产生的原因
    • 模式灵感的来源
    • 模式类图
    • 代码实现
    • 桥接模式和适配器模式的联用
    • 桥接模式的总结
      • 桥接模式的优点:
      • 桥接模式的缺点:

本片博客将介绍桥接模式,桥接模式可以说就是一个组合复用原则的例子,其主要思想就是组合复用。桥接模式是一个比较常用的设计模式,一般情况下,当我们想要构建一个复杂对象时,往往都会使用到桥接模式来进行设计。桥接模式可以将一个复杂对象的多个独立维度分离。

通常情况下,使用桥接模式的复杂对象往往会使用建造者模式来构建。

模式分类

结构型设计模式。

模式产生的原因

如果不使用桥接模式,我们一般就会使用多层继承的方式来构建一个复杂的对象,但是使用多层继承构建对象会存在两点缺点:1. 当有需求变化的时候,系统内使用多层继承的类的数量会急剧上升。2. 使用多层继承构建出来的对象,其不同维度之间的耦合度较高,不能独立拓展。

但是如果我们使用桥接模式来构建这个对象,就不会存在上述的两个问题。

模式灵感的来源

在现实生活中,毛笔和蜡笔是比较常见的两种文具,他们都归属于画笔。假如现在需要大,中,小3种型号的画笔,并且可以分别绘制12种颜色。如果我们使用蜡笔我们就需要准备3 * 12 = 36只蜡笔,但是如果我们使用毛笔我们只需要准备3个型号的毛笔,外加一个有12种颜色的调色板即可,这里我们只需要准备3 + 12 = 15,远小于36,却可以实现与36只蜡笔相同的功能。这里毛笔就使用了桥接模式的思想,将笔的型号和笔的颜色两个属性分离,让其可以单独变化。

这时,如果我们新加一种型号的笔,蜡笔需要增加12只,而毛笔只需要增加1只。

模式类图

桥接模式由以下4个对象组成:

Abstraction(抽象类):

抽象类是我们想要创建的对象的其中一个维度,用于定义抽象类的接口,通常是抽象类而不是接口,抽象类会维护一个实现类的对象。

RefineAbstraction(扩充抽象类):

抽象类的子类,可以拓展父类的一些方法。

Implementor(实现类):

实现类是我们想要创建对象的其余维度,可以只有一个实现类也可以有多个实现类,具体的,有几个维度,我们就有几个实现类,关于如何分别抽象类和实现类我们很快就会说到。

ConcreteImplementor(具体实现类):

实现类的具体类。

关于抽象类和实现类如何判断?

这里我们要知道我们希望通过桥接模式来创建出一个具有多个维度的复杂对象,通常情况下,我们会将与业务方法关系最紧密的维度视为抽象类,也就是主体,剩下的维度会被视为实现类。

就比如上面我们举得例子:我们可以将毛笔的型号作为抽象类,颜色作为实现类。

当然你可以将所有的维度都视为实现类,这时我们就需要单独找一个类来作为我们的抽象类。这种判断方法更加简单快速。

就比如上面我们举得例子:我们可以将毛笔作为抽象类,型号和颜色作为实现类。

代码实现

代码实现上我们举一个飞机制造商的例子:

空客(Airbus)、波音(Boeing)、麦道(McDonnell-Douglas)都是飞机制造商,他们都可以生产载客飞机(PassengerPlane)、载货飞机(CargoPlane),请使用桥接模式来描述飞机制造商和他们生产的飞机。

飞机制造商基类(抽象类):

using System;
using System.Collections.Generic;namespace Bridge.Bridge.Question5
{public abstract class PlaneMaker{//飞机种类列表public List<PlaneClass> PlaneProduct = new List<PlaneClass>();//飞机制造商名字public string MakerName;public PlaneMaker(string name){MakerName = name;}//设置飞机商可以生产的飞机种类public void SetPlaneClass(PlaneClass planeClass){if (PlaneProduct.Contains(planeClass)){return;}PlaneProduct.Add(planeClass);}//打印出这些飞机种类public void SpeakPlaneName(){foreach (var item in PlaneProduct){Console.WriteLine($"{MakerName}的飞机产品{item.SpeakName()}");}}}
}

飞机种类类(实现类):

using System;namespace Bridge.Bridge.Question5
{public abstract class PlaneClass{private string PlaneName;public PlaneClass(string name){PlaneName = name;}public string SpeakName(){return PlaneName;}}
}

空客:

namespace Bridge.Bridge.Question5
{public class Airbus : PlaneMaker{public Airbus(string name) : base(name){}}
}

波音:

namespace Bridge.Bridge.Question5
{public class Boeing : PlaneMaker{public Boeing(string name) : base(name){}}
}

麦道:

namespace Bridge.Bridge.Question5
{public class McDonnell_Douglas : PlaneMaker{public McDonnell_Douglas(string name) : base(name){}}
}

载客飞机:

namespace Bridge.Bridge.Question5
{public class PassengerPlane : PlaneClass{public PassengerPlane(string name) : base(name){}}
}

载货飞机:

namespace Bridge.Bridge.Question5
{public class CargoPlane : PlaneClass{public CargoPlane(string name) : base(name){}}
}

Program:

using Bridge.Bridge.Question5;namespace Bridge
{internal class Program{public static void Main(string[] args){PlaneMaker planeMaker = new Airbus("Airbus");planeMaker.SetPlaneClass(new CargoPlane("CargoPlane"));planeMaker.SetPlaneClass(new PassengerPlane("PassengerPlane"));planeMaker.SpeakPlaneName();planeMaker = new Boeing("Boeing");planeMaker.SetPlaneClass(new CargoPlane("CargoPlane"));planeMaker.SetPlaneClass(new PassengerPlane("PassengerPlane"));planeMaker.SpeakPlaneName();planeMaker = new McDonnell_Douglas("McDonnell_Douglas");planeMaker.SetPlaneClass(new CargoPlane("CargoPlane"));planeMaker.SetPlaneClass(new PassengerPlane("PassengerPlane"));planeMaker.SpeakPlaneName();}}
}

桥接模式和适配器模式的联用

这里我们介绍两种联用的情况,对于这种变化程度较大的具体需求,这里不再提供类图,对于具体需求的构建每个人都会有自己的想法,死记硬背别人的类图没有什么意义。

联用场景1:

当一个适配器的职责比较多时,我们可以利用桥接模式将适配器的职责分离,这样当一个职责有新需求的时候我们就不要重新更改适配器类了。

联用场景2:

当一个复杂对象想要使用一些无法直接调用的接口时,我们可以加入一个适配器维度。

桥接模式的总结

桥接模式的优点:

  1. 在很多情况下,桥接模式都可以取代多层继承方案,多层继承方案违背了单一职责原则,复用性较差,且类的个数非常多。桥接模式是比多层继承方案更好的解决方案,它极大地减少了子类的个数。
  2. 桥接模式提高了系统的可拓展性,在两个变化维度中任意拓展一个维度,不需要修改原有系统,符合开闭原则。

桥接模式的缺点:

  1. 桥接模式的使用会增加系统的理解与设计难度,由于关联关系建立在抽象层,要求开发者一开始就针对抽象层进行设计。
  2. 桥接模式需要正确识别出变化的维度。

C#设计模式之桥接模式相关推荐

  1. java桥接和装饰_设计模式:桥接模式和装饰模式

    原标题:设计模式:桥接模式和装饰模式 一.桥接模式简介 1.基础描述 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是&qu ...

  2. C++设计模式之桥接模式

    这篇文章主要介绍了C++设计模式之桥接模式,本文讲解了什么是桥接模式.为什么要使用桥接模式.什么时候使用桥接模式等内容,需要的朋友可以参考下 问题描述 现在要去画一个图形,图形有长方形.圆形和扇形等等 ...

  3. php设计模式之桥接模式

    php设计模式之桥接模式 一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 其实就是讲不相关的东西通过类(本例中是SendInfo)结合在一起,从而 ...

  4. java 懒加载模式_JavaScript面试系列:JavaScript设计模式之桥接模式和懒加载

    我写的程序员面试系列文章 Java面试系列-webapp文件夹和WebContent文件夹的区别? 程序员面试系列:Spring MVC能响应HTTP请求的原因? Java程序员面试系列-什么是Jav ...

  5. 详解设计模式:桥接模式

    桥接模式(Bridge Pattern)也称为桥梁模式.接口模式或者柄体模式,有点像适配器模式,也是 GoF 的 23 种设计模式中的一种结构型设计模式. 桥接模式 是用于把抽象化与实现化解耦,使得二 ...

  6. 设计模式之桥接模式详解

    设计模式之桥接模式详解 文章目录 设计模式之桥接模式详解 一.什么是桥接模式 二.桥接模式的应用场景 三.桥接模式的角色组成 四.桥接模式通用写法示例 五.桥接模式优缺点 一.什么是桥接模式 桥接模式 ...

  7. 如何让孩子爱上设计模式 ——10.桥接模式(Bridge Pattern)

    如何让孩子爱上设计模式 --10.桥接模式(Bridge Pattern) 标签: 设计模式初涉 我有故事,你有酒吗?这年头写个技术文不讲个故事都不行,行,我讲: 还有发现很多的技术博文都开始有喜欢往 ...

  8. java 设计模式之桥接模式,策略模式

    java 设计模式之桥接模式,策略模式 1.引出设计模式 相信大家都玩过王者荣耀这款游戏.我们知道现在大概有九十多个英雄且各自技能及背景故事.台词.被动都不一样而且还带着召唤师技能比如实现,惩戒,弱化 ...

  9. 《设计模式》桥接模式

    <设计模式>设计模式的基本原则 <设计模式>单例模式 <设计模式>工厂模式 <设计模式>原型模式 <设计模式>建造者模式 <设计模式& ...

  10. 设计模式之桥接模式(Bridge)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

最新文章

  1. 设置让TortoiseGit记住账号和密码
  2. TableLayoutPanel
  3. dev gridcontrol简单的动态设置动态表头
  4. python代码自动格式化_代码的自动格式化
  5. App设计灵感之十二组精美的手机健康监测App设计案例
  6. 如何使用cURL获得请求和响应时间?
  7. php输出学生成绩foreach,PHP中foreach输出值不正确
  8. 2.[精通Hibernate笔记]整合Spring
  9. 如何理解“KISS 原则”?
  10. Ubuntu系统备份和还原,从此避免系统重装
  11. HTML5---2.语义化标签的兼容性问题以及解决方案
  12. TCP协议与IP协议
  13. 办公用品管理系统服务器版,求索办公用品管理系统 2019
  14. 如何利用Social Listening从社会化媒体中“提炼”有价值的信息?
  15. LCN分布式事务(Java)
  16. linux文件权限 705,Linux 文件权限 - osc_86eb7mly的个人空间 - OSCHINA - 中文开源技术交流社区...
  17. 记一次拆机除尘换硅脂的经历,第一次拆机幸好没拆坏,心真大-_-!
  18. 操作系统实验四 进程运行轨迹的跟踪与统计(哈工大李治军)
  19. 淘宝url中的spm编码是怎么生成的呢?
  20. 时钟抖动(Clock Jitter)和时钟偏斜(Clock Skew)

热门文章

  1. epic启动器在哪个文件夹_启动时|原神启动器在哪?启动器文件位置介绍_234游戏网...
  2. Pangu and Stones (hihocoder 1636)
  3. 计算机LCG/PCG/MWC/XorShift等PRNG算法,以及V8中Math.random()、webkit中crypto等随机算法的实现
  4. facebook surround360 环境配置,编译,测试(生成双目立体全景图)
  5. access制作卡片_(2020年编辑)Access入门教程大全
  6. 基于视觉信息的网页分块算法(VIPS) - yysdsyl的专栏 - 博客频道 - CSDN.NET
  7. 游戏人工智能编程案例精粹(修订版) (Mat Buckland 著)
  8. Flutter 集成腾迅 IM Demo 时不同的编译配置的连环坑 2021-12-17
  9. 附带有背景图、文字的二维码
  10. SCN Headroom过低问题处理