桥接模式

前言

桥接模式的代码实现非常简单,但是理解起来稍微有点难度,并且应用场景也比较局限,所以,相当于代理模式来说,桥接模式在实际的项目中并没有那么常用,所以能分辨出来就行了,这里不做重点的学习。

定义

桥接模式:将抽象部分和它的实现部分分离,使他们都可以独立的变化。

看完定义还是一脸懵

举个栗子吧:使用大话模式中的手机栗子来分析

我们知道不同品牌的手机以及不同品牌手机的不同版本对于手机软件的要求是不一样的,可能在M品牌中的软件,就不能在N品牌的手机中使用。M品牌中10代版本的软件可能就不能在1代版本中安装使用。

我们如果使用代码去实现这种关系:

1、按照品牌分类实现的结构图

2、按照软件分类实现的结构图

上面的第一种和第二种实现方式

如果对于手机品牌我们需要增加A,B,C三种,对于软件,我们增加笔记,输入法,闹钟。。。

那么原来已经写好的模块也需要修改,显然这种修改是灾难级别的,新功能的添加就需要很多模块被修改

3、使用桥接模式实现的结构图

第三种也就是我们讲的桥接模式,如果有手机品牌和软件类型的加入,只需要进行扩展就好了,之前已经写好的模块就不用修改了。

由于实现的方式是多种的,桥接模式的核心就是把这些实现独立出来,让他们自己变化。这样每种变化不会影响到其他的实现,从而达到应对变化的目的。

优点

1、抽象与实现分离,扩展能力强

2、符合开闭原则

3、符合合成复用原则

4、其实现细节对客户透明

通俗点讲就是我们的实现系统可能有多角度的分类,每种类都有可能变化,桥架模式做的就是把这些多角度独立出来,让他们可以自己变化,而不影响其他的模块,减少他们之间的藕合。

缺点

桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。

应用场景

1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。

代码实现

还是上面手机的栗子

// 手机软件
type HandsetSoft interface {
Run() string
} // 手机游戏
type HandsetGame struct {
} func (hg *HandsetGame) Run() string {
return "运行手机游戏"
} // 手机通讯录
type HandsetAddressList struct {
} func (hg *HandsetAddressList) Run() string {
return "运行手机通讯录"
} // 手机品牌
type HandsetBrand interface {
SetHandsetSoft(HandsetSoft)
} // M品牌手机手机
type HandsetBrandM struct {
HandsetSoft
} func NewHandsetBrandM() *HandsetBrandM {
return &HandsetBrandM{}
} func (hw *HandsetBrandM) SetHandsetSoft(soft HandsetSoft) {
hw.HandsetSoft = soft
} func (hw *HandsetBrandM) Run() string {
return "M品牌的手机-" + hw.HandsetSoft.Run()
} // N品牌的手机
type HandsetBrandN struct {
HandsetSoft
} func NewHandsetBrandN() *HandsetBrandN {
return &HandsetBrandN{}
} func (ap *HandsetBrandN) SetHandsetSoft(soft HandsetSoft) {
ap.HandsetSoft = soft
} func (ap *HandsetBrandN) Run() string {
return "N品牌的手机-" + ap.HandsetSoft.Run()
}

参考

【文中代码】https://github.com/boilingfrog/design-pattern-learning/tree/master/桥接模式

【大话设计模式】https://book.douban.com/subject/2334288/

【极客时间】https://time.geekbang.org/column/intro/100039001

【桥接模式】https://boilingfrog.github.io/2021/11/11/使用go实现桥接模式/

设计模式学习-使用go实现桥接模式的更多相关文章

  1. C#设计模式学习笔记:(7)桥接模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7699301.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第二个模式--桥 ...

  2. .NET设计模式(9):桥接模式(Bridge Pattern)(转)

    概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就 ...

  3. .NET设计模式(9):桥接模式(Bridge Pattern)

      .NET设计模式(9):桥接模式(Bridge Pattern)   桥接模式(Bridge Pattern) --.NET设计模式系列之九 年月 实现代码如下:..所谓抽象和实现沿着各自维度的变 ...

  4. 设计模式之第10章-桥接模式(Java实现)

    设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...

  5. Java 设计模式系列(七)桥接模式

    Java 设计模式系列(七)桥接模式 桥接模式(Bridge)是一种结构型设计模式.Bridge 模式基于类的最小设计原则,通过使用封装.聚合及继承等行为让不同的类承担不同的职责.它的主要特点是把抽象 ...

  6. 设计模式总结篇系列:桥接模式(Bridge)

    在实际类设计过程中,有时会遇到此类情况:由于实际的需要,某个类具有两个或两个以上的维度变化,如果利用继承将每种可能的变化情况都定义成一个类,一是会导致类膨胀的问题,二是以后不太好维护和并且违背类的设计 ...

  7. Javascript设计模式理论与实战:桥接模式

    桥接模式将抽象部分与实现部分分离开来,使两者都可以独立的变化,并且可以一起和谐地工作.抽象部分和实现部分都可以独立的变化而不会互相影响,降低了代码的耦合性,提高了代码的扩展性. 基本理论 桥接模式定义 ...

  8. 设计模式之十八:桥接模式(Bridge)

    桥接模式: 将抽象部分和它的实现部分相分离开来,以使它们能够单独地变化. UML图: 主要包含: Abstraction:定义了抽象部分的接口.操作一个实现部分对象的引用. RefinedAbstra ...

  9. 【设计模式】结构型04桥接模式(Bridge Pattern)

    学习地址:http://www.runoob.com/design-pattern/bridge-pattern.html 桥接模式(Bridge Pattern) 桥接模式(Bridge patte ...

随机推荐

  1. 《使用Jmeter进行批量发送http请求》

    本文主要针对批量接口发送数据 一:接口测试的环境准备 1:JDK的安装:网上下载即可>1.6.0版本以上 2:jemeter工具的下载 (免安装):网上下载即可 3:插件的下载安装地址:http ...

  2. python 建站教程

    主端:安装nginx uwsgi django pymysql mysql安装mysql到http://repo.mysql.com/里面找 mysql57-community-release-el7 ...

  3. 华为云计算IE面试笔记-其它知识点

    * 虚拟化与云计算的区别?云计算和虚拟化关系?华为云计算怎么做的? 虚拟化是一种具体的技术,实现的是对硬件资源的虚拟化,提升资源利用率,降低能耗,云计算是一种概念各种技术组件的集合,针对的是对各种资源 ...

  4. 解决连接云服务器的redis失败

    在本地连接服务器redis的时候,发现连接失败,这是因为服务器上的redis开启保护模式运行,该模式下是无法进行远程连接的.只需要修改redis目录下的redis.conf文件,找到 protecte ...

  5. NOIP 模拟 六十九

    0+30+40+90, 菜..... T1 取石子 考试扔了将近两个小时,最后也没有回忆起博弈论的相关内容.. 现在只会50pts.正解待补. #include<bits/stdc++.h> ...

  6. Spring IOC Container原理解析

    Spring Framework 之 IOC IOC.DI基础概念 关于IOC和DI大家都不陌生,我们直接上martin fowler的原文,里面已经有DI的例子和spring的使用示例 <In ...

  7. Markdown语法熟悉

    ==(1)标题== # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 ==(2)字体== **加粗** *斜体* ***斜体加粗*** ...

  8. linux版火狐浏览器部署详解

    Firefox下载地址 Firefox全历史版本下载: http://ftp.mozilla.org/pub/firefox/releases/ Firefox驱动问题下载  https://gith ...

  9. Spring启动过程源码分析基本概念

    Spring启动过程源码分析基本概念 本文是通过AnnotationConfigApplicationContext读取配置类来一步一步去了解Spring的启动过程. 在看源码之前,我们要知道某些类的 ...

  10. 初学Python-day12 装饰器函数

    装饰器 1.概念 本质就是一个Python函数,其他函数在本身不变的情况下去增加额外的功能,装饰器的返回值是一个函数. 常用的场景:插入日志,事务处理,缓存,权限校验等. 2.普通函数回顾 1 def ...