设计模式一桥接模式
一、什么是所谓的桥接模式?
桥接模式(Bridge Pattern)是一种面向对象的设计模式,属于结构型模式的一种。其主要目的是将一个类的抽象部分与它的实现部分分离,使它们可以独立变化。这样做的好处是可以减少系统中的类的数量,简化系统的结构,并提高系统的可扩展性。通过桥接模式,可以在运行时动态地给一个抽象化的对象设置不同的实现化对象,这样就能够在不改动代码的情况下增加新的实现或者改变现有的实现。。
二、结构组成
抽象(Abstraction):定义抽象接口,通常包含对实现接口的引用。
扩展抽象(Refined Abstraction):对抽象的扩展,可以是抽象类的子类或具体实现类。
实现(Implementor):定义实现接口,提供基本操作的接口。
具体实现(Concrete Implementor):实现实现接口的具体类。
三、应用场景
使用目的:
桥接模式的一个常用场景就是为了替换继承。我们知道继承有很多优点,比如抽象,封装,多态等,父类封装共性,子类实现特性。继承可以很好地帮助我们实现代码复用(封装)的功能,但是同时,这也是继承的一大缺点。因为父类拥有的方法,子类也会继承得到,无论子类是否需要。这说明了继承具备强侵入性(父类代码侵入子类),同时会导致子类臃肿。因此,在设计模式中,有一个原则为,优先使用组合/聚合的方式,而不是继承。
使用场景:
抽象和实现分离:当你希望将一个系统的抽象化与其实现细节分离,使它们可以独立变化时。例如,在图形界面设计中,你可能想要将图形的形状(如矩形、圆形)与绘制这些形状的具体平台(如Windows、macOS)分离,这样就可以在不修改图形代码的情况下添加新的平台支持。
实现细节透明化:当你希望对客户隐藏实现细节,让客户仅关心抽象层次的操作时。桥接模式允许客户只与抽象类交互,而不直接与实现类打交道。
多维度分类的系统:当一个系统中的对象可以按照多个维度进行分类,而这些维度之间的组合会产生大量的子类时,可以使用桥接模式来减少子类的数量。例如,一个汽车系统可以按颜色(红色、蓝色)和型号(轿车、SUV)分类,如果不使用桥接模式,就需要为每种组合创建一个子类。
四、实现
//视频文件
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("完美世界");
}
}