1.概述
桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分与实现部分分离,使它们可以独立地变化。它的核心思想就是将一个大类或一系列紧密关联的类拆分成两个独立的抽象和实现部分,以便能够更加灵活地扩展和变化。
2.结构
桥接(Bridge)模式包含以下主要角色:
- 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。
3.案例
【例】视频播放器
需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Linux等)上播放多种格式的视频文件,常见的视频格式包括RMVB、AVI、WMV等。该播放器包含了两个维度,适合使用桥接模式。
/**
* @author 晓风残月Lx
* @date 2023/7/6 15:06
* 视频文件(实现化角色)
*/
public interface VideoFile {
// 解码功能
void decode(String fileName);
}
/**
* @author 晓风残月Lx
* @date 2023/7/6 15:08
* rmvb视频文件(具体的实现化角色)
*/
public class RmvbVideoFile implements VideoFile {
@Override
public void decode(String fileName) {
System.out.println("rmvb视频文件:" + fileName);
}
}
/**
* @author 晓风残月Lx
* @date 2023/7/6 15:07
* Avi视频文件(具体的实现化角色)
*/
public class AviVideoFile implements VideoFile {
@Override
public void decode(String fileName) {
System.out.println("avi视频文件:" + fileName);
}
}
/**
* @author 晓风残月Lx
* @date 2023/7/6 15:09
* 抽象的操作系统类(抽象化角色)
*/
public abstract class OperatingSystem {
// 声明videoFile变量
protected VideoFile videoFile;
public OperatingSystem(VideoFile videoFile) {
this.videoFile = videoFile;
}
// 播放
public abstract void play(String fileName);
}
/**
* @author 晓风残月Lx
* @date 2023/7/6 15:12
* Mac操作系统(扩展抽象化角色)
*/
public class MacSystem extends OperatingSystem {
public MacSystem(VideoFile videoFile) {
super(videoFile);
}
@Override
public void play(String fileName) {
videoFile.decode(fileName);
}
}
/**
* @author 晓风残月Lx
* @date 2023/7/6 15:11
* Linux系统(扩展抽象化角色)
*/
public class LinuxSystem extends OperatingSystem {
public LinuxSystem(VideoFile videoFile) {
super(videoFile);
}
@Override
public void play(String fileName) {
videoFile.decode(fileName);
}
}
/**
* @author 晓风残月Lx
* @date 2023/7/6 15:13
*/
public class Client {
public static void main(String[] args) {
// 创建linux系统
OperatingSystem system = new LinuxSystem(new AviVideoFile());
system.play("流浪地球2");
// MAC系统
OperatingSystem system1 = new MacSystem(new RmvbVideoFile());
system1.play("嘻嘻哈哈");
}
}
4.优缺点
桥接模式的优点:
- 抽象和实现部分分离,扩展能力强。
- 符合单一职责原则和开闭原则,程序更 加健壮,可维护、可扩展。
- 对于不同的实现化角色,可以方便地进行切换。
桥接模式的缺点:
- 增加了系统的理解和设计难度。
- 需要正确识别出抽象化和实现化两个独立的方向