本文已参与「新人创作礼」活动,一起开启掘金创作之路。
模式意图
在原先的类中扩展功能,与装饰者模式类似,但比装饰者模式简易,例如桥接模式中某个操作系统实现播放某个格式的音乐文件,而装饰者模式中炒饭里加鸡蛋,可以多次添加。
模式结构
抽象化角色
扩展抽象化角色
抽象实现化角色
具体实现化角色
应用实例
编辑
开发一个跨平台播放器,可在Windows和Mac操作系统上播放多种格式的视频,即每个操作系统都能调用不同的视频文件。
桥接模式比较简单,就是将需要扩展的功能所共同实现的接口聚合到我们的类中,创建操作系统类时,将想要播放的视频对象传入赋值给成员变量。
编辑
package mode; public class Client { public static void main(String[] args) { OperatingSystem system = new Mac(new AviFile()); system.play("喜羊羊"); } } interface VideoFile{ void decode(String fileName); } //具体实现化角色 class AviFile implements VideoFile{ @Override public void decode(String fileName) { System.out.println("AviFile:"+fileName); } } //具体实现化角色 class RmvbFile implements VideoFile{ @Override public void decode(String fileName) { System.out.println("RmvbFile:"+fileName); } } abstract class OperatingSystem{ //声明videoFile变量 protected VideoFile videoFile; public OperatingSystem(VideoFile videoFile){ this.videoFile = videoFile; } public abstract void play(String fileName); } //扩展抽象化角色 class Windows extends OperatingSystem{ public Windows(VideoFile videoFile) { super(videoFile); } @Override public void play(String fileName) { videoFile.decode(fileName); } } //扩展抽象化角色 class Mac extends OperatingSystem{ public Mac(VideoFile videoFile) { super(videoFile); } @Override public void play(String fileName) { videoFile.decode(fileName); } }
优点
提高系统扩展性,在两个变化维度中任意扩展一个维度不需要修改原有系统(扩展操作系统数量或者音乐文件格式的数量)
使用场景
- 当一个类存在两个独立变化的维度且需要扩展时
- 一个系统不希望使用继承扩展功能
- 一个系统需要在构建的抽象化角色和具体角色之间增加更多灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使他们在抽象层建立一个关系关系