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

文章目录

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

介绍

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

  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.mzph.cn/news/882573.shtml

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

相关文章

鸿蒙网络编程系列3-TCP客户端通讯示例

1. TCP简介 TCP协议是传输层最重要的协议&#xff0c;提供了可靠、有序的数据传输&#xff0c;是多个广泛使用的表示层协议的运行基础&#xff0c;相对于UDP来说&#xff0c;TCP需要经过三次握手后才能建立连接&#xff0c;建立连接后才能进行数据传输&#xff0c;所以效率差了…

Go_Parser部署、使用与原理分析

文章目录 前言1、概述2、安装与使用2.1、源码安装2.1.1、部署系统依赖组件2.1.1.1、部署IDA Pro 7.5 SP32.1.1.2、部署Python 3.9.132.1.1.3、部署Go 1.13.1 2.1.2、使用源码安装系统 2.2、使用方法2.2.1、准备测试程序2.2.2、创建IDA Pro项目2.2.3、使用Go_Parser解析二进制程…

植物大战僵尸杂交版游戏分享

植物大战僵尸杂交版游戏下载&#xff1a;夸克网盘分享 无捆绑之类的隐形消费&#xff0c;下载即玩

电力调度控制中心在电力系统中的作用

在庞大而复杂的电力系统中&#xff0c;电力调度控制中心犹如一颗智慧的心脏&#xff0c;扮演着不可或缺的角色。它不仅是电力输送与分配的指挥官&#xff0c;更是确保电网安全、稳定、高效运行的守护者。关于电力调度控制中心在电力系统中的作用&#xff0c;我们具体了解一下。…

全新子比主题7.9.2开心版 子比主题最新版源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 wordpress zibll子比主题7.9.2开心版 修复评论弹授权 可做付费下载站 含wordpress搭建视频教程zibll子比主题安装视频教程支付配置视频教程&#xff0c;视频都是语音讲解&#xff0c;…

AI产品经理:从入门到精通,一篇文章带你入门!(附学习资料)

一、AI产品经理工作全流程概览 AI产品经理工作全流程中与普通产品经理的区别主要是多了算法模型部分&#xff0c;包括模型预研、数据准备、模型构建、模型宣讲、模型验收&#xff0c;协作的对象相对普通产品经理也多了算法工程师。 二、需求定义 需求定义主要要定义清楚以下几…

Ubuntu系衍生版手动修改配置网卡的配置总结

一、Ubuntu系的IP地址配置文件的目录&#xff1a; sudo vim /etc/network/interfaces 二、以DHCP方式配置网卡&#xff1a; 在以上配置文件中添加以下两行&#xff1a; auto enp3s0 iface enp3s0 inet dhcp 三、为网卡配置静态IP地址&#xff1a; 在以上配置文件中添…

探索迷宫的奥秘:用 C++ 打造你的迷宫游戏之旅!

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

面试官:重量级锁的8连问,你能接住几个?

前言 接上一篇偏向锁的十连问&#xff0c;继续升级到重量级锁的进阶版&#xff0c;检验一下自己离精通重量级锁还有多远。建议在读之前了解下Java中重量级锁的实现原理。 重量级锁的ObjectMonitor和JUC中的AQS有什么异同 为什么ObjectMonitor需要cxq和entryList两个等待队列 …

THP4 SOP16 芯片 高速光耦芯片

光电耦合器输入端加电信号使发光源发光&#xff0c;光的强度取决于激励电流的大小&#xff0c;此光照射到封装在一起的受光器上后&#xff0c;因光电效应而产生了光电流&#xff0c;由受光器输出端引出&#xff0c;这样就实现了电一光一电的转换。 由于光耦合器输入输出间互相…

5g工业路由器最新案例:高原气象站网络升级项目

背景&#xff1a; 某省气象局决定在高原地区升级其气象观测网络&#xff0c;以提高天气预报的准确性和及时性&#xff0c;同时为气候变化研究提供更可靠的数据支持。该项目面临以下挑战&#xff1a; 需要在高原广袤且地形复杂的区域部署大量自动气象站&#xff0c;要求网络覆…

Java配置 Redis 连接互斥锁或队列预先加载缓存

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

【HuggingFace 如何上传数据集 (2) 】国内网络-稳定上传图片、文本等各种格式的数据

【HuggingFace 下载】diffusers 中的特定模型下载&#xff0c;access token 使用方法总结【HuggingFace 下载中断】Git LFS 如何下载指定文件、单个文件夹&#xff1f;【HuggingFace 如何上传数据集】快速上传图片、文本等各种格式的数据 上文的方法因为是 https 协议&#xf…

1024-过去一年的总结

目录 前言 (10月-24.01)故事的开始 &#xff08;2月-7月&#xff09;漫长的学习与探索 &#xff08;8月-现在&#xff09;低谷期 自我审视 前言 1024在即,就借此机会讲一讲过去一年的经历&#xff0c;也算是全方位总结一下自己 (10月-24.01)故事的开始 那就从去年大一入学…

【C++】STL——priority_queue优先级队列

目录 前言priority_queue的使用简单使用在OJ中的使用 priority_queue的模拟实现基本功能仿函数在这里插入图片描述 前言 上一节我们说了stack和queue这两种容器适配器&#xff0c;而priority_queue&#xff08;优先级队列&#xff09;同样也是属于容器适配器&#xff0c;它会优…

【Fargo】9:模拟图片采集的内存泄漏std::bad_alloc

std::bad_alloc 崩溃。这样的内存分配会导致内存耗尽 is simulating an image of size 640x480 with 3 bytes per pixel, resulting in an allocation of approximately 921,600 bytes (or around 900 KB) for each image. The error you’re encountering (std::bad_alloc) ty…

Java 多线程(四)—— 线程安全 与 volatile 与 单例模式

什么是线程安全 在进行多线程编程的时候&#xff0c;当我们编写出来的多线程的代码运行结果不符合我们的预期的时候&#xff0c;这时候就是 bug&#xff0c;这种 bug 是由于多线程的问题而产生出来的 bug 我们称之为 线程安全问题 当我们编写出来的多线程代码运行之后的结果符…

学习文档(5)

Redis应用 目录 Redis应用 Redis 除了做缓存&#xff0c;还能做什么&#xff1f; Redis 可以做消息队列么&#xff1f; Redis 可以做搜索引擎么&#xff1f; 如何基于 Redis 实现延时任务&#xff1f; Redis 除了做缓存&#xff0c;还能做什么&#xff1f; 分布式锁&…

三周精通FastAPI:5 查询参数和字符串校验

FastAPI手册&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/query-params-str-validations/ 查询参数和字符串校验 FastAPI 允许你为参数声明额外的信息和校验。让我们以下面的应用程序为例&#xff1a; from fastapi import FastAPIapp FastAPI()app.get("/it…

基于springboot+thymeleaf+springsecurity搭建一套web小案例

一、前言 本案例中的源代码已上传到资源库&#xff0c;可自行下载&#xff0c;传送阵 https://download.csdn.net/download/qq_36260963/89906196 Spring Boot是为了简化Spring应用的创建、运行、调试、部署等而出现的&#xff0c;使用它可以做到专注于Spring应用的开发&#x…