C++設計模式-Facade模式

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 };

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 模式

相關文章
相關標籤/搜索