1 概述
将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
桥接(Bridge)模式包含以下主要角色:
- 抽象化(Abstraction)角色 :定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化(Refined Abstraction)角色 :是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化(Implementor)角色 :定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化(Concrete Implementor)角色 :给出实现化角色接口的具体实现。
2 例子
需要开发一个跨平台视频播放器,可以在不同操作系统平台(如Windows、Mac、Linux等)上播放多种格式的视频文件,常见的视频格式包括RMVB、AVI、WMV等。该播放器包含了两个维度,适合使用桥接模式。
类图如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| public interface VideoFile { void decode(String fileName); }
public class AVIFile implements VideoFile { public void decode(String fileName) { System.out.println("avi视频文件:"+ fileName); } }
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); }
public class Windows extends OperatingSystem { public Windows(VideoFile videoFile) { super(videoFile); }
public void play(String fileName) { videoFile.decode(fileName); } }
public class Mac extends OperatingSystemVersion { public Mac(VideoFile videoFile) { super(videoFile); }
public void play(String fileName) { videoFile.decode(fileName); } }
public class TestClient { public static void main(String[] args) { OperatingSystem os = new Windows(new AVIFile()); os.play("战狼3"); } }
|
3 优缺点
桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
如:如果现在还有一种视频文件类型 wmv,我们只需要再定义一个类实现VideoFile接口即可,其他类不需要发生变化。
实现细节对客户透明
一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时,适合使用桥接模式。