07:橋接模式——C++實現
目錄
一、介紹
橋接(Bridge)是用於把抽象化與實現化解耦,使得二者可以獨立變化。這種型別的設計模式屬於結構型模式,它通過提供抽象化和實現化之間的橋接結構,來實現二者的解耦。又稱為柄體(Handle and Body)模式或介面(Interfce)模式。
類的功能層次結構:父類具有基本功能,在子類中增加新的功能;
類的實現層次結構:父類通過宣告抽象方法來定義介面,子類通過實現具體方法來實現介面;
二、應用場景
1、如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯絡,通過橋接模式可以使它們在抽象層建立一個關聯關係。
2、對於那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用。
3、一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴充套件。
對於兩個獨立變化的維度,使用橋接模式再適合不過了。
三、要點
將抽象部分與實現部分分離,使它們都可以獨立的變化。
橋接模式中有四個角色:
抽象化角色:使用實現者角色提供的介面來定義基本功能介面。持有實現者角色,並在功能介面中委託給它,起到搭建橋樑的作用;抽象化角色並不是指它就是一個抽象類,而是指抽象了實現。
改善後的抽象化角色
實現者角色:提供了用於抽象化角色的介面;它是一個抽象類或者介面。
具體的實現者角色:作為實現者角色的子類,通過實現具體方法來實現介面;與其構成類的實現層次結構。
如果抽象和實現兩者做不到獨立地變化,就不算橋接模式。
四、樣例
#include <iostream> using namespace std; class HandsetSoft { public: virtual void Run() = 0; virtual ~HandsetSoft(){} }; class HandsetGame : public HandsetSoft { public: void Run() { cout << "執行手機遊戲" << endl; } ~HandsetGame(){} }; class HandsetAddressList : public HandsetSoft { public: void Run() { cout << "執行手機通訊錄" << endl; } ~HandsetAddressList(){} }; class HandsetBrand { protected: HandsetSoft* soft; public: void SetHandsetSoft(HandsetSoft* soft) { this->soft = soft; } virtual void Run() = 0; virtual ~HandsetBrand() {} }; class HandsetBrandN : public HandsetBrand { public: void Run() { soft->Run(); } ~HandsetBrandN() {} }; class HandsetBrandM : public HandsetBrand { public: void Run() { soft->Run(); } ~HandsetBrandM() {} }; int main() { HandsetBrand* ab; HandsetBrandN hbn; HandsetGame hg; ab = &hbn; ab->SetHandsetSoft(&hg); ab->Run(); // 執行手機遊戲 HandsetAddressList hl; ab->SetHandsetSoft(&hl); ab->Run(); // 執行手機通訊錄 HandsetBrandM hbm; ab = &hbm; ab->SetHandsetSoft(&hg); ab->Run(); // 執行手機遊戲 ab->SetHandsetSoft(&hl); ab->Run(); // 執行手機通訊錄 return 0; }
五、優缺點
優點:
1、抽象和實現的分離。
2、優秀的擴充套件能力。
3、實現細節對客戶透明。
缺點:
橋接模式的引入會增加系統的理解與設計難度,由於聚合關係建立在抽象層,要求開發者針對抽象進行設計與程式設計。
結構比較複雜。
抽象類的修改會影響到子類。
六、和介面卡模式異同
同:都是讓兩個東西配合工作。
異:
介面卡:改變已有的兩個介面,讓他們相容。適配是先有兩邊東西,才有介面卡。
橋接模式:分離抽象化和實現,使兩者的介面可以不同,目的是分離。橋接是先有“橋”,才有兩端的東西。橋接在橋好了後,兩邊的東西還可以變化。