橋接模式(Bridge),將抽象部分與它的實現部分分離,使他們均可以獨立地變化。ios
什麼是抽象與它的實現分離,這並非說,讓抽象類與其派生類分離,由於這沒有任何意義。實現指的是抽象類和它的派生類用來實現本身的對象。實現系統可能有多角度分類,每一種分類都有可能變化,那麼就把這種多角度分離出來讓他們獨立變化,減小他們之間的耦合。也就是說在咱們發現須要多角度去分類實現對象,而只用繼承會形成大量的類增長,不能知足開放-封閉原則時,就應該考慮用橋接模式。this
橋接模式基本代碼spa
#include <iostream> using namespace std; //Implementor類 class Implementor { public: virtual void Operator()=0; }; //ConcreteImplementorA和ConcreteImplementorB等派生類 class ConcreteImplementorA:public Implementor { public: void Operator() { cout << "具體實現A的方法執行" << endl; } }; class ConcreteImplementorB:public Implementor { public: void Operator() { cout << "具體實現B的方法執行" << endl; } }; //Abstraction類 class Abstraction { protected: Implementor *m_implementor; public: void SetImplementor(Implementor *implementor) { this->m_implementor=implementor; } virtual void Operator() { m_implementor->Operator(); } }; //RefinedAbstraction類 class RefinedAbstraction:public Abstraction { public: void Operator() { m_implementor->Operator(); } }; int main() { Abstraction *ab=new Abstraction(); ab->SetImplementor(new ConcreteImplementorA()); ab->Operator(); ab->SetImplementor(new ConcreteImplementorB()); ab->Operator(); return 0; }
2、合成/聚合複用原則code
合成/聚合原則(CARP),儘可能使用合成/聚合,儘可能不要使用類繼承。對象
對象的繼承關係是在編譯時就定義i好了,因此沒法在運行時改變從父類繼承的實現。子類的實現與它的父類有很是緊密的依賴關係,以致於父類實現中的任何變化必然會致使子類發生變化。當你須要複用子類時,若是繼承下來的實現不適合解決新的問題,則父類必須重寫或被其餘更適合的類替換。這種依賴關係限制了靈活性並最終限制了複用性。
blog
聚合表示一種弱的擁有關係,體現的是A對象能夠包含B對象,但B對象不是A對象的一部分;合成則是一種強的擁有關係,體現了嚴格的部分和總體的關係,部分和總體的生命週期同樣。合成/聚合複用原則的好處是,優先使用對象的合成/聚合將有助於你保持每一個類被封裝,並被集中在單個任務上。這樣類和類繼承層次會保持較小規模,而且不太可能增加爲不可控制的龐然大物。繼承
#include <iostream> using namespace std; //手機軟件 class HandSetSoft { public: virtual void Run()=0; }; //手機遊戲 class HandSetGame:public HandSetSoft { public: void Run() { cout << "運行手機遊戲" << endl; } }; //手機通信錄 class HandSetAddressList:public HandSetSoft { public: void Run() { cout << "運行手機通信錄" << endl; } }; //手機品牌 class HandSetBrand { protected: HandSetSoft *m_soft; public: void SetHandSetSoft(HandSetSoft *soft) { this->m_soft=soft; } virtual void Run(){} }; //品牌N品牌M具體類 class HandSetBrandN:public HandSetBrand { public: void Run() { m_soft->Run(); } }; class HandSetBrandM:public HandSetBrand { public: void Run() { m_soft->Run(); } }; int main() { HandSetBrand *ab=new HandSetBrandN(); ab->SetHandSetSoft(new HandSetGame()); ab->Run(); ab->SetHandSetSoft(new HandSetAddressList()); ab->Run(); ab=new HandSetBrandM(); ab->SetHandSetSoft(new HandSetGame()); ab->Run(); ab->SetHandSetSoft(new HandSetAddressList()); ab->Run(); return 0; }