一、原理講解
1.1意圖
將抽象部分和實現部分分離,使它們可以獨立的變化。(別名:handle/body)
1.2應用場景
- 當你不希望抽象和它的實現部分有一種緊密耦合關係,希望在運行時可以切換不同的實現;
- 類的抽象和實現都可以通過繼承子類的方法進行擴充,這時可以選着橋接模式,運用組合方式分別對抽象和實現進行擴充;
- 當你像完全對客戶隱藏抽象時,可以使用橋接模式;(繼承時,抽象是可見的)
- 當你像抽象有多個擴展,實現也有多個方向擴展時使用。’
1.3結構圖(UML圖)
1.4代碼實現步驟
a1 定義一個抽象接口類Abstraction,抽象接口函數operation();(抽象部分定義接口,實現在具體類中)
a2 定義一個實現接口類Implement,抽象接口函數operation();(抽象部分定義接口,實現在具體類中)
a3 定義一個擴展抽象類RefinedAbstraction : public Abstraction。在類RedefinedAbstraction實現接口函數operation(),組合實現抽象Implement,在operation函數內實現具體操作;(最重要的組合抽象實現類)
a4 定義兩個具體實現類ConcreteImplementA和ConcreteImplementB,具體的實現細節放在接口函數operation()裏面。(具體實現類細節)
二、實現代碼
BridgeParttern.cpp
#include <iostream>
using namespace std;
#define DELETE(pointer) delete pointer; pointer=nullptr
class Abstraction // 抽象接口
{
public:
virtual ~Abstraction(){}
virtual void operation() = 0;
protected:
Abstraction() {}
};
class Implement // 實現抽象接口
{
public:
virtual ~Implement() {}
virtual void operation() = 0;
protected:
Implement() {}
};
class ConcreteImplementA : public Implement // 具體實現細節類A
{
public:
virtual void operation() override
{
cout << "run function ConcreteImplementA::operation()!" << endl;
}
};
class ConcreteImplementB : public Implement // 具體實現細節類B
{
public:
virtual void operation() override
{
cout << "run function ConcreteImplementB::operation()!" << endl;
}
};
class RefinedAbstraction : public Abstraction // 具體抽象細節類
{
public:
RefinedAbstraction(Implement* implement)
{
this->implement = implement;
}
virtual void operation() override
{
cout << "enter function RefinedAbstraction::operation()!" << endl;
implement->operation();
}
private:
Implement* implement;
};
void doBridgeParttern()
{
//抽象實例調用實現A
Implement *implement = new ConcreteImplementA();
Abstraction *abstraction = new RefinedAbstraction(implement);
abstraction->operation();
DELETE(implement);
DELETE(abstraction);
//抽象實例調用實現B
implement = new ConcreteImplementB();
abstraction = new RefinedAbstraction(implement);
abstraction->operation();
DELETE(implement);
DELETE(abstraction);
}
main.cpp
#include <iostream>
extern void doBridgeParttern();
int main()
{
doBridgeParttern();
system("pause");
return 1;
}
參考內容:
https://www.cnblogs.com/070412-zwc/p/6891271.html(參考:代碼實現)
https://www.bilibili.com/video/av22292899?from=search&seid=8813426322713310552(參考:嗶哩嗶哩C++設計模式!!!)
Erich Gamma,Richard Helm.《設計模式 可複用面向對象軟件的基礎》[M].機械工業出版社,2019:115-123