Facade模式html
做用:爲子系統中的一組接口提供一個一致的界面,Facade模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。ios
動機app
將一個系統劃分紅爲若干個子系統有利於下降系統的複雜性。一個常見的設計目標是使子系統間的通訊和相互依賴關係達到最小。this
達到該目標的途徑之一是就是引入一個外觀(Facade)對象,它爲子系統中較通常的設施提供了一個單一而簡單的界面。spa
將各個子系統整合起來做爲Facade,提供給客戶端使用。設計
適用性代理
1.當你要爲一個複雜子系統提供一個簡單接口時。指針
2.客戶程序與抽象類的實現部分之間存在着很大的依賴性。code
3.當你須要構建一個層次結構的子系統時,使用Facade模式定義子系統中每層的入口點。僅經過facade進行通信。htm
UML圖以下:
Facade:
知道哪些子系統類負責處理請求。
將客戶的請求代理給適當的子系統對象。
Subsystem classes :
實現子系統的功能。
處理由Facade對象指派的任務。
沒有facade的任何相關信息;即沒有指向facade的指針。
客戶程序經過發送請求給Facade的方式與子系統通信, Facade將這些消息轉發給適當的子系統對象。
儘管是子系統中的有關對象在作實際工做,但Facade模式自己也必須將它的接口轉換成子系統的接口。
Facade模式有助於創建層次結構系統,也有助於對對象之間的依賴關係分層。
Facade模式能夠消除複雜的循環依賴關係。下降客戶-子系統之間的耦合度。
使用Facade的客戶程序不須要直接訪問子系統對象。
代碼以下:
Facade.h
1 #ifndef _FACADE_H_ 2 #define _FACADE_H_ 3 4 class Subsystem1 5 { 6 public: 7 Subsystem1(); 8 ~Subsystem1(); 9 void Operation(); 10 }; 11 12 class Subsystem2 13 { 14 public: 15 Subsystem2(); 16 ~Subsystem2(); 17 void Operation(); 18 }; 19 20 class Facade 21 { 22 public: 23 Facade(); 24 ~Facade(); 25 void OperationWrapper(); 26 private: 27 Subsystem1* _subsys1; 28 Subsystem2* _subsys2; 29 }; 30 31 #endif
Facade.cpp
1 #include "Facade.h" 2 #include <iostream> 3 4 using namespace std; 5 6 Subsystem1::Subsystem1() 7 {} 8 9 Subsystem1::~Subsystem1() 10 {} 11 12 void Subsystem1::Operation() 13 { 14 cout << "Subsystem1::Operation" << endl; 15 } 16 17 Subsystem2::Subsystem2() 18 {} 19 20 Subsystem2::~Subsystem2() 21 {} 22 23 void Subsystem2::Operation() 24 { 25 cout << "Subsystem2::Operation" << endl; 26 } 27 28 Facade::Facade() 29 { 30 this->_subsys1 = new Subsystem1(); 31 this->_subsys2 = new Subsystem2(); 32 } 33 34 Facade::~Facade() 35 { 36 delete this->_subsys1; 37 delete this->_subsys2; 38 39 this->_subsys1 = NULL; 40 this->_subsys2 = NULL; 41 } 42 43 void Facade::OperationWrapper() 44 { 45 this->_subsys1->Operation(); 46 this->_subsys2->Operation(); 47 }
main.cpp
1 #include "Facade.h" 2 3 int main() 4 { 5 Facade* pFacade = new Facade(); 6 pFacade->OperationWrapper(); 7 return 0; 8 }
另外一個例子,轉自http://www.cnblogs.com/bastard/archive/2012/02/03/2336706.html:
1 subsystemClasses
以三種信息:SMS,MMS,PUSH爲例:checkReady,getContent
1 /*----------------------------------------------------------------*/ 2 /* class Base */ 3 /*----------------------------------------------------------------*/ 4 class Base 5 { 6 public: 7 Base(){}; 8 };
1 /*----------------------------------------------------------------*/ 2 /* class SmsUtil */ 3 /*----------------------------------------------------------------*/ 4 class SmsUtil: public Base 5 { 6 #define SMS_CONTENT "I am sms content" 7 public: 8 SmsUtil(){} 9 bool checkReady() 10 { 11 cout<<"SmsUtil checkReady"<<endl; 12 return true; 13 } 14 bool getSmsContent(int msg_id,char* pContent) 15 { 16 cout<<"SmsUtil getSmsContent"<<endl; 17 strcpy(pContent,SMS_CONTENT); 18 return true; 19 } 20 }; 21 22 /*----------------------------------------------------------------*/ 23 /* class MmsUtil */ 24 /*----------------------------------------------------------------*/ 25 class MmsUtil: public Base 26 { 27 #define MMS_CONTENT "I am mms content" 28 public: 29 MmsUtil(){} 30 bool checkReady() 31 { 32 cout<<"MmsUtil checkReady"<<endl; 33 return true; 34 } 35 bool getMmsContent(int msg_id,char* pContent) 36 { 37 cout<<"MmsUtil getMmsContent"<<endl; 38 strcpy(pContent,MMS_CONTENT); 39 return true; 40 } 41 }; 42 43 /*----------------------------------------------------------------*/ 44 /* class PushUtil */ 45 /*----------------------------------------------------------------*/ 46 class PushUtil: public Base 47 { 48 #define PUSH_CONTENT "I am push content" 49 public: 50 PushUtil(){} 51 bool checkReady() 52 { 53 cout<<"PushUtil checkReady"<<endl; 54 return true; 55 } 56 bool getPushContent(int msg_id,char* pContent) 57 { 58 cout<<"PushUtil getPushContent"<<endl; 59 strcpy(pContent,PUSH_CONTENT); 60 return true; 61 } 62 };
2 Facade ——單例類
1 /*----------------------------------------------------------------*/ 2 /* class MsgFacade */ 3 /*----------------------------------------------------------------*/ 4 enum MsgType 5 { 6 SMS, 7 MMS, 8 PUSH, 9 MSG_ALL 10 }; 11 12 class MsgFacade: public Base 13 { 14 protected: 15 MsgFacade() 16 { 17 m_sms = new SmsUtil(); 18 m_mms = new MmsUtil(); 19 m_push = new PushUtil(); 20 } 21 public: 22 static MsgFacade* getInstance() 23 { 24 if (s_instance == NULL) 25 { 26 s_instance = new MsgFacade(); 27 } 28 29 return s_instance; 30 } 31 static void closeInstance() 32 { 33 delete s_instance; 34 } 35 public: 36 bool checkReady(int type) 37 { 38 bool resutl = false; 39 40 resutl = m_sms->checkReady(); 41 resutl &= m_mms->checkReady(); 42 resutl &= m_push->checkReady(); 43 44 return resutl; 45 } 46 bool getMsgContent(int type,int msg_id,char* pContent) 47 { 48 switch(type) 49 { 50 case SMS: 51 { 52 m_sms->getSmsContent(msg_id,pContent); 53 break; 54 } 55 case MMS: 56 { 57 m_mms->getMmsContent(msg_id,pContent); 58 break; 59 } 60 case PUSH: 61 { 62 m_push->getPushContent(msg_id,pContent); 63 break; 64 } 65 default: 66 break; 67 } 68 69 return true; 70 } 71 private: 72 SmsUtil* m_sms; 73 MmsUtil* m_mms; 74 PushUtil* m_push; 75 76 static MsgFacade* s_instance; 77 }; 78 MsgFacade* MsgFacade::s_instance = NULL;
3 Test
1 #include "facade.h" 2 3 int main() 4 { 5 MsgFacade* msg = MsgFacade::getInstance(); 6 msg->checkReady(MSG_ALL); 7 8 cout<<endl; 9 char content[100] = {0}; 10 11 msg->getMsgContent(SMS,0,content); 12 cout<<content<<endl; 13 14 msg->getMsgContent(MMS,0,content); 15 cout<<content<<endl; 16 17 msg->getMsgContent(PUSH,0,content); 18 cout<<content<<endl; 19 20 return 0; 21 }
4 Result
SmsUtil checkReady
MmsUtil checkReady
PushUtil checkReady
SmsUtil getSmsContent
I am sms content
MmsUtil getMmsContent
I am mms content
PushUtil getPushContent
I am push content
僅須要一個Facade對象,所以Facade對象一般屬於Singleton 模式