桥接模式

前言

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

定义

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

看完定义还是一脸懵

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

我们知道不同品牌的手机以及不同品牌手机的不同版本对于手机软件的要求是不一样的,可能在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. P7737-[NOI2021]庆典【tarjan,虚树】

    正题 题目链接:https://www.luogu.com.cn/problem/P7737 题目大意 给出一张无向图满足若\(x\Rightarrow z,y\Rightarrow z\)那么有\( ...

  2. P7581-「RdOI R2」路径权值【长链剖分,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P7581 题目大意 给出\(n\)个点的有边权有根树,\(m\)次询问一个节点\(x\)的所有\(k\)级儿子两两之 ...

  3. P4585-[FJOI2015]火星商店问题【线段树,可持久化Trie】

    正题 题目链接:https://www.luogu.com.cn/problem/P4585 题目大意 \(n\)个集合,开始每个集合中有一个数字. 开启新的一天并且往集合\(s\)中插入数字\(v\ ...

  4. 小记SpringMVC与SpringBoot 的controller的返回json数据的不同

    近期由于项目的改动变更,在使用springmvc和springboot测试的时候发现一个有趣的现象 1.springmvc的controller使用@ResponseBody返回的仅仅是json格式的 ...

  5. 踩坑系列《九》 无法获取实体类xxx对应的表名

    话不多说,直接说明原因 类似于 @MapperScan(basePackages = "com.hyxiao.user.mapper") 启动类的mapper扫描注解的导入包正确的 ...

  6. react之组建通信

    父组件与子组件通信 父组件将自己的状态传递给子组件,子组件当做属性来接收,当父组件更改自己状态的时候,子组件接收到的属性就会发生改变 父组件利用ref对子组件做标记,通过调用子组件的方法以更改子组件的 ...

  7. 看动画学算法之:平衡二叉搜索树AVL Tree

    目录 简介 AVL的特性 AVL的构建 AVL的搜索 AVL的插入 AVL的删除 简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜 ...

  8. 基于TLS证书手动部署kubernetes集群

      一.简介 Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S. K8S是Google内部一个叫Borg的容器集群管理系统 ...

  9. 在hive中使用COALESCE进行空值处理

    COALESCE (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值.如果所有的表达式都是空值,最终将返 ...

  10. [no code][scrum meeting] Alpha 9

    项目 内容 会议时间 2020-04-15 会议主题 OCR验收 会议时长 15min 参会人员 OCR组成员 $( "#cnblogs_post_body" ).catalog( ...