1.意圖 將抽象部分與它的實現部分分離,使它們都可以獨立地變化。 2.動機 在抽象類與它的實現之間起到橋梁作用,使它們可以獨立地變化。 3.適用性 不希望在抽象和它的實現部分之間有一個固定的綁定關係。這種情況可能是因為,在程式運行時刻實現部分可以被選擇或切換。 類的抽象以及它的實現部分都應該可以通過 ...
1.意圖
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
2.動機
在抽象類與它的實現之間起到橋梁作用,使它們可以獨立地變化。
3.適用性
- 不希望在抽象和它的實現部分之間有一個固定的綁定關係。這種情況可能是因為,在程式運行時刻實現部分可以被選擇或切換。
- 類的抽象以及它的實現部分都應該可以通過生成子類的方式加以擴充。這時橋接模式使你可以對不同的抽象介面和實現部分進行組合,並分別對它們進行擴充。
- 對一個抽象實現部分的修改的修改不應該對客戶產生影響,即客戶代碼不必要重新編譯。
- 對客戶完全隱藏抽象的實現部分。C++中類的表示在類介面中是可見的。
- 有許多類要生成,這樣一種類層次結構說明你必須將一個對象分解成兩部分。
4.結構
5.代碼實例
#include <memory> class AbstactionImpl; class Abstration { public: void virtual Operaion()=0; void virtual SetImpl(std::shared_ptr<AbstactionImpl>& pImpl)=0; protected: std::shared_ptr<AbstactionImpl> m_pImpl; }; class RedefinedAbstration : public Abstration { public: void Operaion(); void SetImpl(std::shared_ptr<AbstactionImpl>& pImpl); };
class AbstactionImpl { public: void virtual OperationImpl()=0; }; class ConcreteImplentorA : public AbstactionImpl { public: void OperationImpl(); }; class ConcreteImplentorB : public AbstactionImpl { public: void OperationImpl(); };
#include "Abstration.h" #include "Implentor.h" void RedefinedAbstration::Operaion() { m_pImpl->OperationImpl(); } void RedefinedAbstration::SetImpl(std::shared_ptr<AbstactionImpl>& pImpl) { m_pImpl = pImpl; }
#include <iostream> #include "Implentor.h" void ConcreteImplentorA::OperationImpl() { std::cout<<"ConcreteImplenorA Exectued" <<std::endl; } void ConcreteImplentorB::OperationImpl() { std::cout<<"ConcreteImplentorB Exectued"<<std::endl; }
#include <memory> #include "Abstration.h" #include "Implentor.h" int main() { std::shared_ptr<AbstactionImpl> pConcreteImplA(new ConcreteImplentorA); std::shared_ptr<AbstactionImpl> pConcreteImplB(new ConcreteImplentorB); std::shared_ptr<RedefinedAbstration> pRedefinedAbstration(new RedefinedAbstration); pRedefinedAbstration->SetImpl(pConcreteImplA); pRedefinedAbstration->Operaion(); pRedefinedAbstration->SetImpl(pConcreteImplB); pRedefinedAbstration->Operaion(); while(1); }
6.測試結果
7.效果
- 分離介面及其實現部分 一個實現未必不變地綁定在一個介面上。抽象類的實現可以在運行時刻進行配置,一個對象甚至可以在運行時刻改變它的實現。將Abstraction和Implementor分離有助於降低對實現部分編譯時刻的依賴性,當改變一個實現類時,並不需要重新編譯Abstaction類和它的客戶程式。
- 提高可擴充性 可以獨立地對Abstraction和Implementor層次結構進行擴充。
- 實現細節對客戶透明 可以對客戶隱藏實現細節。