橋接模式:將抽象部分與實現部分分離,使它們都可以獨立變化。屬於結構型模式。
橋接模式就是將系統中兩個維度的變化分離為兩條獨立繼承體系,通過聚合橋接。
Implementor。變化維度一:音頻格式(MP3、WAV、WMA)
變化維度二:操作系統播放接口(Linux、Windows、Unix)
若強耦合:需 3×3=9 個類。橋接後:3 個 Player 子類 + 3 個 OS 子類,組合靈活。
// 實現化接口:操作系統播放
class OperatingSystem {
public:
virtual ~OperatingSystem() {}
virtual void playAudio() = 0;
};
class LinuxOS : public OperatingSystem { void playAudio() override { cout << "Linux"; } };
class WindowsOS : public OperatingSystem { void playAudio() override { cout << "Windows"; } };
class UnixOS : public OperatingSystem { void playAudio() override { cout << "Unix"; } };
// 抽象化角色:播放器
class Player {
protected:
OperatingSystem* os;
public:
Player() : os(nullptr) {}
void setOS(OperatingSystem* o) { os = o; }
virtual ~Player() {}
virtual void play() = 0;
};
// 修正抽象化:具體格式播放器
class MP3Player : public Player {
public:
void play() override { cout << "Play MP3 on "; os->playAudio(); cout << endl; }
};
class WAVPlayer : public Player {
public:
void play() override { cout << "Play WAV on "; os->playAudio(); cout << endl; }
};
class WMAPlayer : public Player {
public:
void play() override { cout << "Play WMA on "; os->playAudio(); cout << endl; }
};
// 客戶端組合
int main() {
Player* mp3 = new MP3Player();
mp3->setOS(new LinuxOS()); mp3->play();
mp3->setOS(new WindowsOS()); mp3->play();
mp3->setOS(new UnixOS()); mp3->play();
// 同理 WAV、WMA...
}
| 維度 | 橋接模式 | 策略模式 |
|---|---|---|
| 意圖 | 結構分離:抽象與實現獨立演化 | 行為封裝:算法族可互換 |
| 關係 | 聚合,長期綁定 | 聚合/關聯,運行時可換 |
| 抽象層 | 有抽象類層次 | 通常只有接口 |
| 典型場景 | 跨平台、驅動程序、持久化 | 排序算法、壓縮算法、支付方式 |
橋接模式的精髓是「組合優於繼承」:將抽象接口與具體實現解耦,構建兩條平行繼承體系,通過聚合橋接。關鍵識別:系統中是否存在兩個「各自獨立演化」的維度?若是,橋接是最佳選擇。