继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用!
5.5 桥接模式
5.5.1 定义
将抽象与实现分离,使他们可以独立变化,即用组合关系来代替继承关系实现,从而降低抽象与实现两个可变维度耦合度
5.5.2 结构
- 抽象化角色(Abstrction):定义抽象类,并包含一个对实现对象的引用
- 扩展抽象化(Refined Abstraction)角色:抽象化角色子类,实现父类方法,并通过组合关系来调用实现化角色中业务方法
- 实现化角色(Implementor):定义实现化角色接口,供扩展抽象化角色调用
- 具体实现化角色(Concrete Implementor ):给出实现化角色接口具体实现
5.5.3 案例(播放器)
- VideoFile
public interface VideoFile {
void decode(String fileName);
}
- AviVideoFile
public class AviVideoFile implements VideoFile{
@Override
public void decode(String fileName) {
System.out.println("AviVideo 视频文件: " + fileName);
}
}
- RmvVideoFile
public class RmvVideoFile implements VideoFile{
@Override
public void decode(String fileName) {
System.out.println("RmvVideoFile 视频文件: " + fileName);
}
}
- 抽象化角色
public abstract class OperatingSystem {
// 声明videoFile文件
public VideoFile videoFile;
public OperatingSystem(VideoFile videoFile) {
this.videoFile = videoFile;
}
public abstract void play(String fileName);
}
- 抽象具体化角色
public class WindowsSystem extends OperatingSystem{
public WindowsSystem(VideoFile videoFile) {
super(videoFile);
}
@Override
public void play(String fileName) {
videoFile.decode(fileName);
}
}
- 抽象具体化角色
public class MacSystem extends OperatingSystem{
public MacSystem(VideoFile videoFile) {
super(videoFile);
}
@Override
public void play(String fileName) {
videoFile.decode(fileName);
}
}
- 类图
5.5.4 优点
- 提高了系统的可扩充性,且两维度扩充均不需要修改原有系统
- 实现细节对客户透明
5.5.5 使用场景
- 当某个类存在两个独立变化维度且两维度均需要扩展时
- 当某系统不希望使用继承或因多层继承导致系统类个数急剧增加时
- 当某系统需要在构件的抽象化角色和具体化角色之间增加更多灵活性时,可通过此模式在抽象层建立关联关系,避免在两个层次之间建立静态的继承关系