设计模式系列:结构型-桥接模式(Bridge Pattern)
简介
桥接模式(Bridge Pattern)是一种结构型设计模式,它通过将抽象部分与实现部分分离,使它们可以独立地变化。桥接模式的主要目的是降低系统各部分之间的耦合度,提高系统的可维护性和可复用性。
在桥接模式中,将抽象部分和实现部分分别放在两个不同的层次中,抽象层和实现层相互独立。抽象层定义了抽象接口,并且通过引用实现层的接口来调用实现层的具体实现。这样,抽象层和实现层都可以独立地变化,提高了系统的灵活性和可扩展性。
结构
桥接(Bridge)模式包含以下主要角色:
- 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。
案例实现
【例】视频播放器
需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Mac、Linux等)上播放多种格式的视频文件,常见的视频格式包括RMVB、AVI、WMV等。该播放器包含了两个维度,适合使用桥接模式。
类图如下:
代码如下:
//视频文件
public interface VideoFile {
void decode(String fileName);
}
//avi文件
public class AVIFile implements VideoFile {
public void decode(String fileName) {
System.out.println("avi视频文件:"+ fileName);
}
}
//rmvb文件
public class REVBBFile implements VideoFile {
public void decode(String fileName) {
System.out.println("rmvb文件:" + fileName);
}
}
//操作系统版本
public abstract class OperatingSystemVersion {
protected VideoFile videoFile;
public OperatingSystemVersion(VideoFile videoFile) {
this.videoFile = videoFile;
}
public abstract void play(String fileName);
}
//Windows版本
public class Windows extends OperatingSystem {
public Windows(VideoFile videoFile) {
super(videoFile);
}
public void play(String fileName) {
videoFile.decode(fileName);
}
}
//mac版本
public class Mac extends OperatingSystemVersion {
public Mac(VideoFile videoFile) {
super(videoFile);
}
public void play(String fileName) {
videoFile.decode(fileName);
}
}
//测试类
public class Client {
public static void main(String[] args) {
OperatingSystem os = new Windows(new AVIFile());
os.play("战狼3");
}
}
好处:
-
桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
如:如果现在还有一种视频文件类型wmv,我们只需要再定义一个类实现VideoFile接口即可,其他类不需要发生变化。
-
实现细节对客户透明
优缺点
桥接模式的优点包括:
- 降低耦合度:通过将抽象部分和实现部分分离,桥接模式降低了系统各部分之间的耦合度,使得各部分可以独立地变化。
- 提高可维护性和可复用性:由于抽象层和实现层相互独立,因此可以独立地对它们进行修改、测试和复用,提高了系统的可维护性和可复用性。
- 增强灵活性:桥接模式使得系统可以在运行时动态地切换或组合不同的实现,增强了系统的灵活性。
然而,桥接模式也存在一些缺点:
- 可能增加系统复杂度:由于需要将抽象部分和实现部分分离,并且需要定义两个层次的接口,因此可能会增加系统的复杂度。
- 可能引入额外的开销:为了实现分离的抽象和实现部分之间的通信,需要定义适当的接口和回调机制,这可能会引入额外的开销。
应用场景
- 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
- 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
- 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。
源码中应用
JDK
JDBC(Java Database Connectivity)
在 JDBC 中,连接数据库的不同方式(例如通过不同的驱动程序)和不同的数据库之间的通信方式(例如通过不同的协议)也可以看作是桥接模式的应用。JDBC 提供了一种接口来连接不同的数据库,而具体的数据库驱动程序则是不同的实现。这种设计使得 JDBC 可以支持多种数据库和连接方式,而不必修改客户端代码。
Java 8 中的 Stream API
Stream API 提供了一种在集合上进行操作的方式,其中涉及了桥接模式的概念。Stream 接口充当了抽象部分,而具体的实现(例如串行流和并行流)则是通过不同的操作来实现的。这种设计使得可以在不同的上下文中使用相同的流操作,而不必关心流的具体实现。
微信:17873041739
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?