基于SpringBoot设计模式之结构型设计模式·桥接模式

news2024/11/25 2:34:31

文章目录

  • 介绍
  • 开始
    • 架构图
      • 定义类的功能
      • 定义类的实现
    • 测试样例
  • 总结

介绍

  将抽象部分与它的实现部分分离,使他们都可以独立地发生变化。

  Bridge的意思是桥梁。就像在现实世界中,桥梁的功能是将河流的两侧连接起来一样,
Bridge模式的作用也是将两样东西连接起来,它们分别是类的功能层次结构和类的实现层次结构。
Bridge模式的作用是在类的功能层次结构类的实现层次结构之间搭建桥梁

开始

架构图

在这里插入图片描述

定义类的功能

@Slf4j
public abstract class Platform {

    protected Video video;

    public Platform(Video video) {
        this.video = video;
    }

    public abstract void openVideo(Long videoId);
    public abstract void downloadVideo(Long videoId);

}


@Slf4j
public class WindowsPlatform extends Platform {

    public WindowsPlatform(Video video) {
        super(video);
    }

    @Override
    public void openVideo(Long videoId) {


        log.info("在windows上,开始播放 video");

        video.show(videoId);


    }

    @Override
    public void downloadVideo(Long videoId) {

        log.info("开始针对视频源,将其转化为windows可播放源,进行下载");

        video.download(videoId);

    }
}

@Slf4j
public class LinuxPlatform extends Platform {

    public LinuxPlatform(Video display) {
        super(display);
    }

    @Override
    public void openVideo(Long videoId) {


        log.info("在linux上,开始播放 video");

        video.show(videoId);


    }

    @Override
    public void downloadVideo(Long videoId) {

        log.info("开始针对视频源,将其转化为linux可播放源,进行下载");

        video.download(videoId);

    }
}

定义类的实现

public interface Video {

    /**
     * 下载视频
     */
    void download(Long videoId);

    /**
     * 查看视频信息
     */
    void show(Long videoId);

}

@Service("mp4Video")
@Slf4j
public class MP4Video implements Video {

    @Override
    public void download(Long videoId) {

        log.info("正在查询MP4格式的视频源");

        log.info("正在查询视频编号:{}", videoId);
        String url = "/usr/local/video/" + UUID.randomUUID();
        log.info("查询结束下载地址:{}", url);
    }

    @Override
    public void show(Long videoId) {

        log.info("正在查询MP4格式的视频源");

        log.info("正在查询视频编号:{}", videoId);
        String url = "/usr/local/video/" + UUID.randomUUID();
        log.info("查询结束,立即播放:{}", url);
    }
}
@Service("movVideo")
@Slf4j
public class MOVVideo implements Video {

    @Override
    public void download(Long videoId) {

        log.info("正在查询MOV格式的视频源");

        log.info("正在查询视频编号:{}", videoId);
        String url = "/usr/local/video/" + UUID.randomUUID();
        log.info("查询结束下载地址:{}", url);
    }

    @Override
    public void show(Long videoId) {

        log.info("正在查询MOV格式的视频源");

        log.info("正在查询视频编号:{}", videoId);
        String url = "/usr/local/video/" + UUID.randomUUID();
        log.info("查询结束,立即播放:{}", url);
    }
}

测试样例

@Slf4j
@SpringBootTest(classes = BridgeApplication.class)
public class TestBridge {

    @Resource
    private Map<String, Video> videoMap;

    @Test
    public void testLinuxPlatform() {

        Platform linuxPlatform1 = new LinuxPlatform(videoMap.get("mp4Video"));
        linuxPlatform1.openVideo(1L);
        linuxPlatform1.downloadVideo(1L);

        Platform linuxPlatform2 = new LinuxPlatform(videoMap.get("movVideo"));
        linuxPlatform2.openVideo(10L);
        linuxPlatform2.downloadVideo(10L);

    }

    @Test
    public void testWindowsPlatform() {

        Platform windowsPlatform1 = new LinuxPlatform(videoMap.get("mp4Video"));
        windowsPlatform1.openVideo(2L);
        windowsPlatform1.downloadVideo(2L);

        Platform windowsPlatform2 = new LinuxPlatform(videoMap.get("movVideo"));
        windowsPlatform2.openVideo(20L);
        windowsPlatform2.downloadVideo(20L);

    }

}

总结

  Bridge模式的特征是将类的功能层次结构类的实现层次结构分离开了。将类的这两个层次结构分离开有利于独立地对它们进行扩展。当想要增加功能时,只需要在类的功能层次结构一侧增加类即可,不必对类的实现层次结构做任何修改。而且,增加后的功能可以被所有的实现使用。例如,在此样例中我们还可以将类的功能层次结构应用于软件所运行的操作系统上。如果我们将某个程序中依赖于操作系统的部分划分为 Windows版Macintosh 版Unix 版,那么我们就可以用 Bridge模式中的类的实现层次结构来表现这些依赖于操作系统的部分。

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

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

相关文章

FPGA图像处理之中值滤波

文章目录 一、什么是中值滤波&#xff1f;二、均值滤波和中值滤波对比三、FPGA实现3.1 Verilog代码3.2 仿真验证 一、什么是中值滤波&#xff1f; 在前一篇《FPGA图像处理之均值滤波》中&#xff0c;我们了解到了图像处理中常遇到的一些噪声类型以及均值滤波的原理以及实现。我…

【Linux】实现倒计时、进度条、gdb

文章目录 缓冲区1.概念2.作用3.刷新策略4.缓冲区位置 实现倒计时实现进度条Linux调试器----gdb 缓冲区 1.概念 缓冲区是计算机内存的一部分&#xff0c;用于暂时存储数据。它在数据传输过程中起到一个缓冲桥梁的作用&#xff0c;帮助协调数据传输的速度差异。缓冲区可以是磁盘…

魔百和 HG680-MC免拆 2+8免拆机卡刷固件

HG680MC免拆完美bin卡刷24年10月21日版本【修复语音、ADB端口9999、开启ADB的Root权限】 更新特点&#xff1a; 1.更新开机桌面为SMART动画&#xff1b; 2.安装app自动安装&#xff0c;无需点击确认、下一步等提示按钮内容; 3.ADB端口号为9999&#xff1b; 4.ADB权限为完美RO…

wireshark 解密浏览器https数据包

一、导出浏览器证书有两种方法 1、在浏览器快捷方式追加启动参数&#xff1a; --ssl-key-log-file"d:\log\2.log" C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe --ssl-key-log-file"d:\log\2.log" 2、环境变量中新建用…

SpringbootSpringcloud面试题(含代码及展示图)

1 简单说一下springboot? Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化Spring应用的初始搭建以及开发过程。 -使用springboot以后,搭建一个spring应用和开发&#xff0c;部署变得很简单. 2 怎么简单实现一个springboot应用 1&#xff09;新建ma…

SpringBoot获取bean的几种方式

目录 一、BeanFactory与ApplicationContext的区别 二、通过BeanFactory获取 三、通过BeanFactoryAware获取 四、启动获取ApplicationContext 五、通过继承ApplicationObjectSupport 六、通过继承WebApplicationObjectSupport 七、通过WebApplicationContextUtils 八、通…

Chrome DevTools 三: Performance 性能面板扩展—— 性能优化

Performance 性能 &#xff08;一&#xff09;性能指标 首次内容绘制 (First Contentful Paint&#xff0c;FCP)&#xff1a; 任意内容在页面上完成渲染的时间 最大内容绘制 (Largest Contentful Paint&#xff0c;LCP)&#xff1a; 最大内容在页面上完成渲染的时间 第一字节…

创客项目秀|基于XIAO ESP32C3的本地个人助理Mr.M

作者&#xff1a;Matthew Yu 来自&#xff1a;Fab academy 在数字化时代的浪潮中&#xff0c;柴火创客空间作为创新与实践的摇篮&#xff0c;不仅为Fab Academy 2024的学员们提供了一个充满活力的学习和创作环境&#xff0c;更是将科技的力量与人文关怀深度融合。今天&#x…

Redis——事务

文章目录 Redis 事务Redis 的事务和 MySQL 事务的区别:事务操作MULTIEXECDISCARDWATCHUNWATCHwatch的实现原理 总结 Redis 事务 什么是事务 Redis 的事务和 MySQL 的事务 概念上是类似的. 都是把⼀系列操作绑定成⼀组. 让这⼀组能够批量执行 Redis 的事务和 MySQL 事务的区别:…

【Next.js 项目实战系列】07-分配 Issue 给用户

原文链接 CSDN 的排版/样式可能有问题&#xff0c;去我的博客查看原文系列吧&#xff0c;觉得有用的话&#xff0c;给我的库点个star&#xff0c;关注一下吧 上一篇【Next.js 项目实战系列】06-身份验证 分配 Issue 给用户 本节代码链接 Select Button​ # /app/issues/[i…

【Java】正则表达式详解

目录 引言 一、基本概念 1.1 元字符 1.2 预定义字符类 1.3 边界匹配符 1.4 数量标识符 1.5 捕获与非捕获分组 二、Java中的正则表达式支持 三、正则表达式的使用示例 3.1 匹配字符串 3.2 替换字符串 3.3 分割字符串 3.4 使用Pattern和Matcher 3.5 捕获组和后向…

【电商项目】1分布式基础篇

1 项目简介 1.2 项目架构图 1.2.1 项目微服务架构图 1.2.2 微服务划分图 2 分布式基础概念 3 Linux系统环境搭建 查看网络IP和网关 linux网络环境配置 补充P123&#xff08;修改linux网络设置&开启root密码访问&#xff09; 设置主机名和hosts映射 主机名解析过程分析&…

金九银十互联网大厂Java高频面试题(2024最新含答案)

2024 年的互联网行业竞争越来越严峻&#xff0c;面试也是越来越难&#xff0c;一直以来我都想整理一套完美的面试宝典&#xff0c;奈何难抽出时间&#xff0c;这套 1200道的 Java 面试手册我整理了整整 1 个月&#xff0c;上传到 Git 上目前 star 数达到了 30K 这套互联网 Jav…

冲击美团!已成功 OC

这是一位训练营学员的美团面经&#xff0c;目前已经 OC 。 在此之前他已经拿到了不少公司的offer&#xff0c;但是都达不到他的预期&#xff0c;美团给的待遇就非常不错&#xff0c;大厂不愧是大厂&#xff0c;就是不知道工作强度如何。 他经历了一共三场面试&#xff0c;一面…

实现省略号查看详情样式

1.期望实现效果 2.目前实现效果 3.实现代码 1.wxml<view class"desc-text"><view class"show-more">查看详情 >></view><!-- <rich-text nodes"{{富文本接口数据内容 }}"></rich-text> --><text&…

python反爬

1.无限debug无法f12 关闭掉 Deactivate Breakpoints

【闲谈程序设计例三则:抛弃传统单步进初级阶段,用推导归纳出来的规律写代码,进入进阶阶段,人类自性的高级活动。】2024-10-21

闲谈程序设计三则&#xff1a;抛弃传统单步进&#xff0c;用推导归纳出来的规律写代码。 本论坛常见新学提问都是一些入门级别的问题&#xff0c;近来AI活跃抢答&#xff0c;然而&#xff0c;对于有些问题AI可以说是答非所问&#xff0c;令人哭笑不得&#xff0c;而AI能回答的…

MacOS安装BurpSuite

文章目录 一、下载地址二、下载注册机三、安装教程四、启动burpsuit五、免责声明 一、下载地址 https://portswigger-cdn.net/burp/releases/download?productpro&version2024.7.1&typeMacOsx二、下载注册机 https://github.com/NepoloHebo/BurpSuite-BurpLoaderKey…

B站协议登录到实现各种功能完整代码(专栏总结)

B站协议登录、点赞、收藏、转发实现及代码 关注、动态转发实现动态抽奖实现及代码 直播预约抽奖实现及代码 本文为本专栏的总结文章 一、扫码登录 请求获取二维码包&#xff0c;得到二维码链接和qrcode_key参数之后&#xff0c;利用qrcode_key循环GET请求登录状态包即可&#x…

【word】页眉横线无法取消

小伙伴们日常想在页眉里加横线&#xff0c;直接双击页眉&#xff0c;然后在页眉横线里选择自己喜欢的横线样式就可以了。 但今天我遇到的这个比较奇特&#xff0c;有些页有这个横线&#xff0c;有些页没有&#xff0c;就很奇怪。 最后排查完&#xff0c;发现是只有标题2的页…