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

devtools/2024/10/20 20:03:24/

文章目录

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

介绍

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

  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);}@Overridepublic void openVideo(Long videoId) {log.info("在windows上,开始播放 video");video.show(videoId);}@Overridepublic void downloadVideo(Long videoId) {log.info("开始针对视频源,将其转化为windows可播放源,进行下载");video.download(videoId);}
}
@Slf4j
public class LinuxPlatform extends Platform {public LinuxPlatform(Video display) {super(display);}@Overridepublic void openVideo(Long videoId) {log.info("在linux上,开始播放 video");video.show(videoId);}@Overridepublic 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 {@Overridepublic void download(Long videoId) {log.info("正在查询MP4格式的视频源");log.info("正在查询视频编号:{}", videoId);String url = "/usr/local/video/" + UUID.randomUUID();log.info("查询结束下载地址:{}", url);}@Overridepublic 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 {@Overridepublic void download(Long videoId) {log.info("正在查询MOV格式的视频源");log.info("正在查询视频编号:{}", videoId);String url = "/usr/local/video/" + UUID.randomUUID();log.info("查询结束下载地址:{}", url);}@Overridepublic 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 {@Resourceprivate Map<String, Video> videoMap;@Testpublic 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);}@Testpublic 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.ppmy.cn/devtools/127366.html

相关文章

SQL 自学:游标(Cursors)的理解与应用

在 SQL 中&#xff0c;游标&#xff08;Cursor&#xff09;是一种用于处理从数据库中检索出的多行数据的机制。它允许我们逐行地处理查询结果集&#xff0c;而不是一次性处理整个结果集。 一、游标是什么 游标可以看作是一个指向结果集的指针。通过游标&#xff0c;我们可以在…

CMake技术细节:解决未定义,提供参数

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

顺序表的实现(数据结构)——C语言

目录 1.结构与概念 2.分类 3 动态顺序表的实现 SeqList.h SeqList.c 创建SLInit&#xff1a; 尾插SLPushBack以及SLCheak&#xff08;检查空间是否足够&#xff09;&#xff1a; 头插SLPushFront&#xff1a; 尾删SLPopBack 头删SLPopFront 查找指定元素SLFind 指定…

linux环境下C程序的编译过程以及makefile的简单使用

在windows下&#xff0c;很多用来进行编程软件对于写好的文件&#xff0c;点击编译即可生成想要文件。如.exe可执行文件&#xff0c;.hex文件或者.bin文件等等。软件为我们省略了很多事。但是对于linux初学者来说&#xff0c;初次接触linux系统&#xff0c;面对命令行黑框框有点…

什么是同步锁?

同步锁&#xff08;Synchronized Lock&#xff09;是多线程编程中的一个关键概念&#xff0c;用来解决多个线程同时访问共享资源时可能引发的数据不一致问题。同步锁通过限制多个线程并发执行关键代码的能力&#xff0c;确保在同一时刻只有一个线程能够访问临界区&#xff08;即…

【DBA Part03】国产Linux上Oracle RAC安装-升级-ADG-迁移

本阶段内容如下&#xff1a; 01.国产统信UOS-Oracle19c安装配置 02.国产龙蜥AnolisOS-Oracle19c RAC集群安装配置 03.Linux-Oracle11gR2数据库升级到Oracle19C 04.Linux-Oracle11gR2 RAC数据库升级到Oracle19c RAC 05.Linux-Oracle19c ADG容灾配置(111级联) 06.Oracle XT…

目标检测系统中需要【重新训练模型】说明

上百种【基于YOLOv8/v10/v11的目标检测系统】目录&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff09;-CSDN博客 目标检测系统操作说明【用户使用指南】&#xff08;pythonpyside6界面系统源码可训练的数据集也完成的训练模型&#xff09;-CSDN…

C语言:函数指针与指针函数的区别*

文章目录 一、函数指针定义语法 二、指针函数定义语法用途 三、函数指针与指针函数的区别本质不同&#xff1a;声明方式&#xff1a; 四、结论 C语言&#xff1a;函数指针与指针函数的区别 在C语言这个充满灵活性和强大表达力的编程世界中&#xff0c;函数指针和指针函数是两个…