桥接模式

前言

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

定义

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

看完定义还是一脸懵

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

我们知道不同品牌的手机以及不同品牌手机的不同版本对于手机软件的要求是不一样的,可能在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. IOS 安装网页

    一般使用企业签名的iOS安装包 都需要一个下载地址,像蒲公英什么的 都有下载限制,所以求人不如求己. 内容也是复制别人的 :https://lzw.me/a/itms-services-ios-ins ...

  2. Win10删除电脑3D对象等7个文件夹

    把下面几个注册表项依次删除掉 "图片"文件夹:[-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Expl ...

  3. State Space Model Content

    State Space Model 状态空间模型及其卡尔曼滤波技术 混合正态分布下的状态空间模型及其滤波

  4. 基于 Ubuntu 21.04 BPF 开发环境全攻略

    本文地址:https://www.ebpf.top/post/ubuntu_2104_bpf_env 1. 系统安装 1.1 Vagrant Vagrant 是一款用于构建及配置虚拟开发环境的软件,基 ...

  5. 一个Electron的设计缺陷及应对方案

    当你想实现阻止Electron窗口关闭,并弹出询问对话框,提示用户:"文章尚未保存,是否要关闭窗口"这类业务时,那么你99%会碰到这个BUG: https://github.com ...

  6. 【vue】生成接口模拟数据

    目录 方案一:自定义模拟数据 Step1 创建json文件 Step2 在 vue.config.js 中配置 Step3 在组件中使用 (方式一) Step3 封装api (方式二) Step4 在 ...

  7. java统一返回标准类型

    一.前言.背景 在如今前后端分离的时代,后端已经由传统的返回view视图转变为返回json数据,此json数据可能包括返回状态.数据.信息等......因为程序猿的习惯不同所以返回json数据的格式也 ...

  8. 20 行代码:Serverless 架构下用 Python 轻松搞定图像分类和预测

    作者 | 江昱 前言 图像分类是人工智能领域的一个热门话题.通俗解释就是,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法. 它利用计算机对图像进行定量分析,把图像或图像中 ...

  9. bzoj1067——SCOI2007降雨量(线段树,细节题)

    题目描述 我们常常会说这样的话:"X年是自Y年以来降雨量最多的".它的含义是X年的降雨量不超过Y年,且对于任意\(Y<Z<X\),Z年的降雨量严格小于X年.例如2002 ...

  10. Docker--harbor私有仓库部署与管理

    目录 一.Harbor简介 二.Harbor 部署 三.维护管理Harbor  一.Harbor简介 1.什么是Harbor  ? Harbor 是 VMware 公司开源的企业级 Docker Re ...