结构型模式——桥接模式
桥接模式概述
桥接模式是将抽象与实现分离,是他们可以独立变化,他是用组合关系代理继承关系来实现,从而降低了抽象和实现这两个可变维度之间的耦合度。举个例子的话,在不使用桥接模式时,如果定义两个类“圆”和“红色的圆”,那么这两个类的关系是“红色的圆”继承自“圆”,但是如果使用桥接模式,则变成“圆”和“红的”两个类,将其组合成红色的圆。
桥接模式机构
在桥接模式中包括一下角色:
- 抽象化角色:定义抽象类,并包含一个对实现化对象的引用。
- 扩展抽象化角色: 是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
- 实现化角色: 定义实现化角色的接口,供扩展抽象化角色调用。
- 具体实现化角色:给实现化角色接口的具体实现。
桥接模式实现
在下述实例中,抽象化角色和实现化角色形象的构成了一座桥,在桥的一遍为很多的扩展抽象角色,在桥的另一边是很多的具体实现化角色。因为在抽象化角色中聚合了实现化角色,所以所有的扩展抽象化角色可以调用某个具体实现化角色的功能。
/**
* VideoFile类实现化角色
*/
public interface VideoFile {
void decode(String fileName);
}
/**
* RMVBFile类、AVIFile类是具体实现角色
*/
public class RMVBFile implements VideoFile{
@Override
public void decode(String fileName) {
System.out.println("rmvb文件:"+fileName);
}
}
public class AVIFile implements VideoFile{
@Override
public void decode(String fileName) {
System.out.println("avi视频文件:" + fileName);
}
}
/**
* OperatingSystemVersion类是抽象化角色
*/
public abstract class OperatingSystemVersion {
protected VideoFile videoFile;
public OperatingSystemVersion(VideoFile videoFile){
this.videoFile = videoFile;
}
public abstract void play(String fileName);
}
/**
* Mac类、Windows类是扩展抽象化角色
*/
public class Mac extends OperatingSystemVersion{
public Mac(VideoFile videoFile) {
super(videoFile);
}
@Override
public void play(String fileName) {
videoFile.decode(fileName);
}
}
public class Windows extends OperatingSystemVersion{
public Windows(VideoFile videoFile) {
super(videoFile);
}
@Override
public void play(String fileName) {
videoFile.decode(fileName);
}
}
桥接模式的优点
桥接模式提高了系统的可扩充性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,比如在上述例子中,我们想要添加一个新的操作系统,或者新的视频播放器,只需要添加一个新的扩展抽象化角色和具体实现化角色即可。
文章内容为个人学习总结,如有错误望指正。
参考链接https://www.bilibili.com/video/BV1Np4y1z7BU