文章目录
- 介绍
- 开始
- 架构图
- 定义类的功能
- 定义类的实现
- 测试样例
- 总结
介绍
将抽象部分与它的实现部分分离,使他们都可以独立地发生变化。
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模式中的类的实现层次结构
来表现这些依赖于操作系统的部分。