桥接模式(Bridge Pattern)是一种结构型设计模式,用于将抽象部分与实现部分分离,使它们可以独立变化。它的核心思想是通过引入一个“桥”类,将抽象层与实现层解耦。
桥接模式的结构
-
Abstraction(抽象部分)
定义高层的抽象接口,提供公共的方法声明。 -
Implementor(实现接口部分)
定义实现部分的接口,一般是抽象类或接口。 -
ConcreteImplementor(具体实现部分)
实现具体的逻辑,继承自Implementor
。 -
RefinedAbstraction(扩展抽象部分)
扩展或细化抽象部分的逻辑。
桥接模式的核心是通过 "组合" 而非 "继承" 将抽象部分与实现部分关联。
桥接模式的代码示例
示例场景:不同平台上的视频播放器
我们创建一个桥接模式,处理跨平台的多种视频播放器:
- 抽象出一个播放器的抽象类
VideoPlayer
。 - 提供具体的实现部分接口
Platform
。 - 通过桥接的方式组合它们。
示例代码
cpp
#include <iostream>
#include <memory>
#include <string>using namespace std;// Implementor:定义实现接口
class Platform {
public:virtual ~Platform() = default;virtual void playVideo(const string& video) = 0;
};// ConcreteImplementorA:Windows 实现
class WindowsPlatform : public Platform {
public:void playVideo(const string& video) override {cout << "Playing video on Windows: " << video << endl;}
};// ConcreteImplementorB:Linux 实现
class LinuxPlatform : public Platform {
public:void playVideo(const string& video) override {cout << "Playing video on Linux: " << video << endl;}
};// Abstraction:播放器抽象接口
class VideoPlayer {
protected:shared_ptr<Platform> platform; // 桥接到具体实现的接口public:explicit VideoPlayer(shared_ptr<Platform> p) : platform(std::move(p)) {}virtual ~VideoPlayer() = default;virtual void play(const string& video) = 0;
};// RefinedAbstraction:高级播放器
class AdvancedPlayer : public VideoPlayer {
public:explicit AdvancedPlayer(shared_ptr<Platform> p) : VideoPlayer(std::move(p)) {}void play(const string& video) override {cout << "AdvancedPlayer: Preparing video..." << endl;platform->playVideo(video); // 调用桥接的具体实现cout << "AdvancedPlayer: Finished playing video." << endl;}
};// RefinedAbstraction:普通播放器
class SimplePlayer : public VideoPlayer {
public:explicit SimplePlayer(shared_ptr<Platform> p) : VideoPlayer(std::move(p)) {}void play(const string& video) override {cout << "SimplePlayer: ";platform->playVideo(video); // 调用桥接的具体实现}
};// 客户端代码
int main() {// 创建具体实现:Windows 平台shared_ptr<Platform> windows = make_shared<WindowsPlatform>();// 创建具体实现:Linux 平台shared_ptr<Platform> linux = make_shared<LinuxPlatform>();// 使用不同实现创建播放器VideoPlayer* player1 = new AdvancedPlayer(windows);VideoPlayer* player2 = new SimplePlayer(linux);// 播放视频player1->play("movie.mp4");player2->play("song.mp4");// 释放资源delete player1;delete player2;return 0;
}
输出结果
AdvancedPlayer: Preparing video...
Playing video on Windows: movie.mp4
AdvancedPlayer: Finished playing video.
SimplePlayer: Playing video on Linux: song.mp4
桥接模式的分析
-
角色分离
- 抽象层:
VideoPlayer
提供一个统一的高层接口。 - 实现层:
Platform
定义跨平台的实现接口。
- 抽象层:
-
灵活性
- 平台层(Windows/Linux)和播放器层(Simple/Advanced)可以独立扩展,相互解耦。
-
桥接点
VideoPlayer
和Platform
通过组合关联而不是继承。
桥接模式与 Android 图形栈的关系
在 Android 图形栈中,类似的桥接模式如下:
- 抽象层:高层使用的
IGraphicBufferProducer
。 - 实现层:具体硬件或系统服务提供的 HAL 实现。
- 桥接点:
B2HGraphicBufferProducer
将两个层次桥接,帮助实现抽象和具体逻辑的解耦。