C++設計模式——橋接模式(bridge pattern)

一、原理講解

1.1意圖

將抽象部分和實現部分分離,使它們可以獨立的變化。(別名:handle/body)

1.2應用場景

  • 當你不希望抽象和它的實現部分有一種緊密耦合關係,希望在運行時可以切換不同的實現;
  • 類的抽象和實現都可以通過繼承子類的方法進行擴充,這時可以選着橋接模式,運用組合方式分別對抽象和實現進行擴充;
  • 當你像完全對客戶隱藏抽象時,可以使用橋接模式;(繼承時,抽象是可見的)
  • 當你像抽象有多個擴展,實現也有多個方向擴展時使用。’

1.3結構圖(UML圖)

橋接模式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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章