1.意圖 為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。 2.動機 將一個系統劃分成若幹子系統有利於降低系統的複雜性。一個常見的設計目標是使子系統間的通信和相互依賴達到最小。達到該目標的途徑之一是引入一個外觀對象,它為子系統提供了一個 ...
1.意圖
為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。
2.動機
將一個系統劃分成若幹子系統有利於降低系統的複雜性。一個常見的設計目標是使子系統間的通信和相互依賴達到最小。達到該目標的途徑之一是引入一個外觀對象,它為子系統提供了一個統一的介面。
3.適用性
- 當要為一個複雜子系統提供一個簡單介面時。子系統往往因為不斷演化而變得越來越複雜。大多數模式使用時都會產生更多更小的類。這使得子系統更具可重用性,也更容易對子系統進行定製,但這也給那些不需要定製子系統的用戶帶來一些使用上的困難。Facade可以提供一個簡單的預設視圖,這一視圖對大多數用戶來說已經足夠,而那些需要更多的可定製性的用戶可以越過Facade層。
- 客戶程式與抽象的實現部分之間存在著很大的依賴性。引入Facade將這個子系統與客戶以及其他的子系統分離,可以提高子系統的獨立性和可移植性。
- 當需要構建一個層次結構的子系統時,使用Facade模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,可以讓它們僅通過facade進行通訊,從而簡化了它們之間的依賴關係。
4.結構
5.代碼實例
//Facade.h #include <memory> class House; class FacadeHouse { public: FacadeHouse(); void Build(); private: std::shared_ptr<House> m_ptrHouse; };
//House.h #include <string> class House { public: House(); void Bulid(); void SetDoorColor(std::string sColor); void SetFloorColor(std::string sColor); void SetBedColor(std::string sColor); private: std::string m_sDoorColor; std::string m_sFloorColor; std::string m_sBedColor; };
//Facade.cpp #include "Facade.h" #include "House.h" FacadeHouse::FacadeHouse() { m_ptrHouse = std::shared_ptr<House>(new House); } void FacadeHouse::Build() { m_ptrHouse->Bulid(); }
//House.cpp #include <iostream> #include "House.h" House::House() : m_sDoorColor("Red"), m_sFloorColor("Red"), m_sBedColor("Red") { } void House::Bulid() { std::cout<< "Build House with DoorColor: " << m_sDoorColor <<std::endl; std::cout<< "Build House with FloorColor: " << m_sFloorColor <<std::endl; std::cout<< "Build House with BedColor: " << m_sBedColor <<std::endl; } void House::SetDoorColor(std::string sColor) { m_sDoorColor = sColor; } void House::SetFloorColor(std::string sColor) { m_sFloorColor = sColor; } void House::SetBedColor(std::string sColor) { m_sBedColor = sColor; }
//Client.cpp #include <memory> #include <iostream> #include "House.h" #include "Facade.h" int main() { std::cout<<"Facade Default House:" << std::endl; std::shared_ptr<FacadeHouse> pFacadeHouse(new FacadeHouse); pFacadeHouse->Build(); std::cout<<"User define house:" << std::endl; std::shared_ptr<House> pHouse(new House); pHouse->SetBedColor("Green"); pHouse->SetDoorColor("Green"); pHouse->SetFloorColor("Green"); pHouse->Bulid(); while(1); }
6.測試結果
7.效果
- 它對客戶屏蔽子系統組件,因而減少了客戶處理的對象的數目並使得子系統使用起來更加方便。
- 實現了子系統與客戶之間的松耦合關係,而子系統內部的功能組件往往是緊耦合的。
- 如果應用需要,它並不限制它們使用子系統類。因此可以在系統易用性和通用性之間加以選擇。