设计模式学习-使用go实现桥接模式
桥接模式
前言
桥接模式的代码实现非常简单,但是理解起来稍微有点难度,并且应用场景也比较局限,所以,相当于代理模式来说,桥接模式在实际的项目中并没有那么常用,所以能分辨出来就行了,这里不做重点的学习。
定义
桥接模式:将抽象部分和它的实现部分分离,使他们都可以独立的变化。
看完定义还是一脸懵
举个栗子吧:使用大话模式中的手机栗子来分析
我们知道不同品牌的手机以及不同品牌手机的不同版本对于手机软件的要求是不一样的,可能在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实现桥接模式的更多相关文章
- C#设计模式学习笔记:(7)桥接模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7699301.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第二个模式--桥 ...
- .NET设计模式(9):桥接模式(Bridge Pattern)(转)
概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度?这就 ...
- .NET设计模式(9):桥接模式(Bridge Pattern)
.NET设计模式(9):桥接模式(Bridge Pattern) 桥接模式(Bridge Pattern) --.NET设计模式系列之九 年月 实现代码如下:..所谓抽象和实现沿着各自维度的变 ...
- 设计模式之第10章-桥接模式(Java实现)
设计模式之第10章-桥接模式(Java实现) “一入软件深似海,从此早睡是路人.黑夜给了我黑色的眼睛,我却用他去寻找八阿哥.”“怎么了,又来那么多的感慨啊.”“还能有什么啊,老板是说让换个APP做,这 ...
- Java 设计模式系列(七)桥接模式
Java 设计模式系列(七)桥接模式 桥接模式(Bridge)是一种结构型设计模式.Bridge 模式基于类的最小设计原则,通过使用封装.聚合及继承等行为让不同的类承担不同的职责.它的主要特点是把抽象 ...
- 设计模式总结篇系列:桥接模式(Bridge)
在实际类设计过程中,有时会遇到此类情况:由于实际的需要,某个类具有两个或两个以上的维度变化,如果利用继承将每种可能的变化情况都定义成一个类,一是会导致类膨胀的问题,二是以后不太好维护和并且违背类的设计 ...
- Javascript设计模式理论与实战:桥接模式
桥接模式将抽象部分与实现部分分离开来,使两者都可以独立的变化,并且可以一起和谐地工作.抽象部分和实现部分都可以独立的变化而不会互相影响,降低了代码的耦合性,提高了代码的扩展性. 基本理论 桥接模式定义 ...
- 设计模式之十八:桥接模式(Bridge)
桥接模式: 将抽象部分和它的实现部分相分离开来,以使它们能够单独地变化. UML图: 主要包含: Abstraction:定义了抽象部分的接口.操作一个实现部分对象的引用. RefinedAbstra ...
- 【设计模式】结构型04桥接模式(Bridge Pattern)
学习地址:http://www.runoob.com/design-pattern/bridge-pattern.html 桥接模式(Bridge Pattern) 桥接模式(Bridge patte ...
随机推荐
- webpack工具学习 构建简单vue项目(不依赖vue-cli) webpack4.0
目的用webpack构建简单前端项目 1.npm init (npm init -y) 形成package.json 2.npm install --save-dev webpack 形成 n ...
- pyqt5实现窗口跳转并关闭上一个窗口
关键在于要定义一个关闭窗体的函数colsewin() 然后将按键与该函数连接(connect)在一起即可 import sys from PyQt5.QtWidgets import QMainWin ...
- Spring Cloud Gateway 没有链路信息,我 TM 人傻了(下)
本系列是 我TM人傻了 系列第五期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 获取异 ...
- P7046-「MCOI-03」诗韵【SAM,倍增,树状数组】
正题 题目链接:https://www.luogu.com.cn/problem/P7046 题目大意 给出一个长度为 \(n\) 的字符串,然后 \(m\) 次把它的一个子串加入集合.如果一个字符串 ...
- 【vue】两个页面间传参 - props
目录 Step1 设置可以 props 传递数据 Step2 跳转前页面中传递数据 Step3 跳转后的页面接收数据 从 A 页面跳转到 B 页面, 参数/数据通过 props 传递到 B 页面,这种 ...
- 踩坑系列《一》数据库建表权限 CREATE command denied to user for table
今天在表中用Navicat连接服务器上的mysql账号进行建表,报了个这样类似的错, CREATE command denied to user for table 是数据库权限设置的问题,所以无法进 ...
- html2canvas 无法渲染网络图片及本地 解决方案
使用html2canvas插件可以无法渲染图片的情况 在使用html2canvas的时候.如果元素中还包含网络图片.那么有很大的几率渲染不出来.即时把html2canvas的允许跨域打开也无济于事.这 ...
- VulnHub 实战靶场Breach-1.0
相比于CTF题目,Vulnhub的靶场更贴近于实际一些,而且更加综合考察了知识.在这里记录以下打这个靶场的过程和心得. 测试环境 Kali linux IP:192.168.110.128 Breac ...
- C#开发BIMFACE系列49 Web网页中加载模型与图纸的技术方案
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在BIMFACE二次系列博客中详细介绍了服务器端API的调用方式,如下列表 C#开发BIMFACE系列1 BIMFAC ...
- Ubuntu安装 配置GCC和Vim
VMware14.0和Ubuntu镜像安装 https://mp.weixin.qq.com/s/045wrbdv92PkUQn2abddvA 适应屏幕设置 按照下列流程检查虚拟机设置 查看 -> ...