【设计模式】结构型模式·桥接模式

news2024/12/23 15:01:23

学习汇总入口【23种设计模式】学习汇总(数万字讲解+体系思维导图)
写作不易,如果您觉得写的不错,欢迎给博主来一波点赞、收藏~让博主更有动力吧!

一.概述

将抽象与实现分离,使它们可以独立变化。用组合关系代替继承关系,从而降低抽象和实现这两个可变维度的耦合度。

有点符合七大设计原则中的依赖倒转原则和合成复用原则

【例】

现在有一个需求,需要创建不同的图形,并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系:
在这里插入图片描述

存在的问题:

  • 假如我们再增加一个形状或再增加一种颜色,就需要创建更多的类,会造成类爆炸。

  • 在一个有多种可能会变化的维度的系统中,用继承方式会造成类爆炸,扩展起来不灵活。每次在一个维度上新增一个具体实现都要增加多个子类。

桥接(ridge)模式包含以下主要角色:

  • 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
  • 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。

二.使用

(1) 案例

【例】视频播放器

需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Mac、Linux等)上播放多种格式的视频文件,常见的视频格式包括RMVB、AVI、WMV等。该播放器包含了两个维度(操作系统和视频格式),适合使用桥接模式。

类图如下:
在这里插入图片描述

代码如下:

//视频文件
public interface VideoFile {
    void decode(String fileName);
}

//avi文件
public class AVIFile implements VideoFile {
    public void decode(String fileName) {
        System.out.println("avi视频文件:"+ fileName);
    }
}

//rmvb文件
public class REVBBFile implements VideoFile {

    public void decode(String fileName) {
        System.out.println("rmvb文件:" + fileName);
    }
}

//操作系统版本
public abstract class OperatingSystemVersion {

    protected VideoFile videoFile;

    public OperatingSystemVersion(VideoFile videoFile) {
        this.videoFile = videoFile;
    }

    public abstract void play(String fileName);
}

//Windows版本
public class Windows extends OperatingSystem {

    public Windows(VideoFile videoFile) {
        super(videoFile);
    }

    public void play(String fileName) {
        videoFile.decode(fileName);
    }
}

//mac版本
public class Mac extends OperatingSystemVersion {

    public Mac(VideoFile videoFile) {
        super(videoFile);
    }

    public void play(String fileName) {
		videoFile.decode(fileName);
    }
}

//测试类
public class Client {
    public static void main(String[] args) {
        OperatingSystem os = new Windows(new AVIFile());
        os.play("战狼3");
    }
}

提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。如:如果现在还有一种视频文件类型wmv,我们只需要再定义一个类实现VideoFile接口即可,其他类不需要发生变化。

(2) 使用场景

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为数字化转型之道 结语 数字化转型的8个成功要素

结语 数字化转型的8个成功要素 华为开展数字化转型的过程中,积累了一些经验和教训,总结起来有如下成功要素。 1. 一把手担责 要做好数字化转型,企业家就要有战略决心、信心、耐心。数字化转型一定是企业“一把手工程”,需要企业家自上而下地推动并在企业内达成广泛共识。…

免费开题报告|基于SpringBoot+Vue的校内跑腿平台

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

Android 深入系统完全讲解(29)

MediaMuxer 封装器 MediaMuxer 最多仅支持一个视频 track 和一个音频 track,所以如果有多个音频 track 可以先 把它们混合成为一个音频 track 然后再使用 MediaMuxer 封装到 mp4 容器中。 MediaMuxer 支持输出格式为 MP4,webm 和 3gp. 默认我们就用 mp4.…

产生聚类数据集sklearn.datasets.make_blobs()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 产生聚类数据集 sklearn.datasets.make_blobs() [太阳]选择题 以下python代码结果错误的一项是? import matplotlib.pyplot as plt from sklearn.datasets import make_blobs data,labelmak…

统计-参数估计-假设检验-总结二

统计-参数估计-假设检验-总结二参数估计—区间估计三大分布卡方分布(Gamma分布的特例)t分布F分布求估计区间假设检验参数检验拟合优度检验通往 统计-参数估计-假设检验-总结一参数估计—区间估计 以某一范围提供对参数θ\thetaθ的估计。寻找统计量θ1∗(x1,x2,...,xn)\theta…

20230120英语学习

How Animals May Have Conquered Snowball Earth “雪球地球”时期,动物是如何存活的? Planet Earth used to be something like a cross between a deep freeze and a car crusher.During vast stretches of the planet’s history, everything from p…

微信小程序开发尚学堂 介绍 项目结构 组件 喧嚷 事件 模板

一、微信小程序介绍1. 微信小程序介绍微信小程序,简称小程序,是一种不需要下载安装即可使用的应用,它实现了应用”触手可及”的梦想,用户扫一扫或搜一下即可打开应用。说明:小程序是需要下载的,小程序的占用…

概论_第6章_统计量及其抽样分布_知识结构

先看知识结构图数量统计的特点是 背记的内容多, 与前面概率论 背记和计算的多 有很大区别。本文从统计量的概念讲起, 一. 统计量定义: 设 ...... 为取自某总体的样本, 若样本函数TT(, ... ) 中不含有任何未知参数, 则称T 为统计…

力扣刷题记录——682. 棒球比赛、628. 三个数的最大乘积、693. 交替位二进制数

本专栏主要记录力扣的刷题记录,备战蓝桥杯,供复盘和优化算法使用,也希望给大家带来帮助,博主是算法小白,希望各位大佬不要见笑,今天要分享的是——《力扣刷题记录——682. 棒球比赛、628. 三个数的最大乘积…

企业实施RPA需考虑的20条建议

如何提高效率又能降低成本,是企业发展所面临的重要挑战。在降本增效的路上,RPA(机器人流程自动化)以其特点与优势脱颖而出,迅速得到企业青睐。尽管如此,部署RPA也并非一蹴而就。仓促实施可能会给企业带来更…

实时时钟实现

重要知识点 setInterval是一个实现定时调用的函数,可按照指定的周期(以毫秒计)来调用函数或计算表达式var sNownew Date(),Date 对象会自动把当前日期和时间保存为其初始值。 参数形式有以下5种: new Dat…

SpringBoot 接口幂等性实现的4种方案

目录 什么是幂等性 什么是接口幂等性 为什么需要实现幂等性 引入幂等性后对系统的影响 Restful API 接口的幂等性 如何实现幂等性 方案一:数据库唯一主键 方案二:数据库乐观锁 方案三:防重 Token 令牌 方案四、下游传递唯一序列号 实…

mysql连接查询

笛卡尔积现象: 注意: 效率更高的方法:

Pr 计时器动画

​哈喽,各位小伙伴!今天我们来学习一下如何制作数字滚动的计时器动画? 新建序列 新建一个1920*1080的序列,选择一张图片作为背景(背景图出自不良人第5季,距离第6季开播还有41天) 新建文字图层…

5.算法通关面试 --- 递归and分治and贪心

50. Pow(x, n) https://leetcode.cn/problems/powx-n/

【C语言从0到1之文件操作】(原理 画图 举例 不信教不会你 不要放收藏夹落灰 学起来好嘛)

🕺作者:迷茫的启明星 🎃专栏:《数据库》《C语言从0到1专栏》《数据结构》《C语言杂谈》🏇分享喜欢的一句话:心如花木,向阳而生前言在我们的学习中,文件操作是被我们忽略,…

ML 训练与测试数据不满足同分布 - 如何检测?如何解决?

😄 同分布问题是数据挖掘中的常见问题,也是ML中的一个重要假设。解决训练与测试数据不满足同分布问题,有助于提高模型的泛化性、稳定性! 文章目录一、定义:训练与测试数据不满足同分布定义:❓疑问&#xff…

仿牛客论坛项目

源代码:https://gitee.com/qiuyusy/community 1. Spring 在测试类中使用Spring环境 RunWith(SpringRunner.class) 让Spring先运行ContextConfiguration 导入配置文件implements ApplicationContextAware 后实现方法 获得 applicationContext RunWith(SpringRunner.class) S…

关于JVM

作者:~小明学编程 文章专栏:JavaEE 格言:热爱编程的,终将被编程所厚爱。 目录 内存区域的划分 程序计数器(线程私有) Java虚拟机栈 (线程私有) 本地方法栈 堆(线程共享) 方法…

Leetcode:77. 组合、216. 组合总和 III(C++)

目录​​​​​​​ 77. 组合: 问题描述: 实现代码与解析: 递归(回溯): 原理思路: 剪枝优化版: 原理思路: 216. 组合总和 III: 问题描述&#xff1a…