11 桥接模式
11.1 概念
将抽象与实现分离,使他们可以独立变化。用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
11.2 结构
抽象化角色:定义抽象类,并包含一个对实现化对象的引用。
扩展抽象化角色:抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
实现化角色:定义实现化角色的接口,供扩展抽象化角色使用。
具体实现化角色:给出实现化角色接口的具体实现。
11.3 实现
11.3.1 UML图
11.3.2 代码
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
class VideoFile {
public:
virtual void decode(string fileName) = 0;
};
class MP4File : public VideoFile {
void decode(string fileName) {
cout << "MP4格式文件:" << fileName << endl;
}
};
class RmvbFile : public VideoFile {
void decode(string fileName) {
cout << "rmvb格式文件:" << fileName << endl;
}
};
class OperatingSystem {
protected:
VideoFile* videoFile;
public:
virtual void play(string fileName) = 0;
};
class Windows : public OperatingSystem {
public:
Windows() {}
Windows(VideoFile* videoFile) {
this->videoFile = videoFile;
}
void play(string fileName) {
videoFile->decode(fileName);
}
};
class Mac : public OperatingSystem {
public:
Mac() {}
Mac(VideoFile* videoFile) {
this->videoFile = videoFile;
}
void play(string fileName) {
videoFile->decode(fileName);
}
};
int main() {
OperatingSystem* system = new Windows(new RmvbFile());
system->play("灵笼");
system = new Mac(new MP4File());
system->play("时光代理人");
return 0;
}
11.4 优点
提高系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有系统。
实现细节对客户透明。
11.5 使用场景
当一个类存在两个独立变化的维度,且这两个维度都需要扩展时。
当一个系统不希望使用继承或因为多层次继承导致系统类个数急剧增加时。
当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时,避免在两个层次之间建立静态的继承联系,通过桥接模式可以在抽象层建立一个关联关系。