文章目录
- 0、背景
- 1、模式
- 2、案例
- 3、使用场景
0、背景
现要创建不同的图形,图形的形状有圆、长方形、正方形,且它们有不同的颜色
两个维度在变,使用类的继承可以实现,也符合开闭原则,但会类爆炸。
1、模式
将抽象与实现分离,使它们可以独立变化,用组合代替继承,将两部分连接起来。主要包括以下角色:
- 抽象化角色:抽象类,聚合实现化角色
- 扩展抽象化角色:抽象化角色的子类,通过组合关系调用实现化角色中的业务方法
- 实现化角色:定义接口与方法,供扩展抽象化角色调用
- 具体实现化角色:实现化角色中方法的具体实现
2、案例
开发一个跨操作系统的视频播放器,操作系统要支持Windows和Mac,视频格式要支持AVI和RMVB格式。这是两个维度的变化,可用桥接模式。
定义视频文件类(实现化角色)
//视频文件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("电影.avi");}}
3、使用场景
- 一个类存在两个独立变化的维度,且这两个维度都需要扩展
- 避免两个层次之间建立静态的继承联系,可用桥接模式来建立一个关联关系