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

文章目录

介绍

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

Bridge的意思是桥梁。就像在现实世界中,桥梁的功能是将河流的两侧连接起来一样,

Bridge模式的作用也是将两样东西连接起来,它们分别是类的功能层次结构和类的实现层次结构。

Bridge模式的作用是在类的功能层次结构类的实现层次结构之间搭建桥梁

开始

架构图

定义类的功能

java 复制代码
@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);

}
java 复制代码
@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);

    }
}
java 复制代码
@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);

    }
}

定义类的实现

java 复制代码
public interface Video {

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

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

}
java 复制代码
@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);
    }
}
java 复制代码
@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);
    }
}

测试样例

java 复制代码
@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模式中的类的实现层次结构来表现这些依赖于操作系统的部分。

相关推荐
杨DaB8 小时前
【SpringBoot】Swagger 接口工具
java·spring boot·后端·restful·swagger
昵称为空C10 小时前
SpringBoot接口限流的常用方案
服务器·spring boot
hrrrrb10 小时前
【Java Web 快速入门】十一、Spring Boot 原理
java·前端·spring boot
Zyy~11 小时前
《设计模式》工厂方法模式
设计模式·工厂方法模式
创码小奇客12 小时前
架构师私藏:SpringBoot 集成 Hera,让日志查看从 “找罪证” 变 “查答案”
spring boot·spring cloud·trae
Olrookie13 小时前
XXL-JOB GLUE模式动态数据源实践:Spring AOP + MyBatis 解耦多库查询
java·数据库·spring boot
waynaqua13 小时前
SpringBoot:听说你还不知道时区设置
spring boot
又是努力搬砖的一年13 小时前
SpringBoot中,接口加解密
java·spring boot·后端
ikkkkkkkl13 小时前
C++设计模式:面向对象设计原则
c++·设计模式·面向对象
风象南14 小时前
SpringBoot 自研运行时 SQL 调用树,3 分钟定位慢 SQL!
spring boot·后端