C++外觀模式
<上一節
下一節>
由遇到的問題引出外觀模式
舉一個生活中的小例子,大凡開過學或者畢過業的都會體會到這樣一種郁悶:你要去 n個地方辦理 n 個手續(現在大學合并后就更加麻煩,因為可能那 n 個地方都隔的比較遠)。但是實際上我們需要的就是一個最后一道手續的證明而已,對于前面的手續是怎么辦的、到什么地方去辦理我們都不感興趣。
實際上在軟件系統開發中也經常回會遇到這樣的情況,可能你實現了一些接口(模塊),而這些接口(模塊)都分布在幾個類中(比如 A 和 B、C、D):A 中實現了一些接口,B 中實現一些接口(或者 A 代表一個獨立模塊,B、C、D 代表另一些獨立模塊)。然后你的客戶程序員(使用你設計的開發人員)只有很少的要知道你的不同接口到底是在那個類中實現的,絕大多數只是想簡單的組合你的 A-D 的類的接口,他并不想知道這些接口在哪里實現的。
這里的客戶程序員就是上面生活中想辦理手續的郁悶的人!在現實生活中我們可能可以很快想到找一個人代理所有的事情就可以解決你的問題(你只要維護和他的簡單的一個接口而已了!),在軟件系統設計開發中我們可以通過一個叫做 Façade 的模式來解決上面的問題。
模式選擇
我們通過外觀模式解決上面的問題,其典型的結構圖為:
圖 2-1:外觀模式結構圖
外觀模式的想法、思路和實現都非常簡單,但是其思想卻是非常有意義的。并且外觀設計模式在實際的開發設計中也是應用最廣、最多的模式之一。
一個簡單的例子就是,我在開發 Visual CMCS 項目【注釋 1】時候,在 Visual CMCS 中我們將允許用戶獨立訪問我們的編譯子系統(詞法、語法、語義、代碼生成模塊),這些都是通過特定的類實現的,我們通過使用外觀模式給用戶提供一個高層的接口,供用戶在不想了解編譯器實現的情況下去使用或重用我們的設計和實現。我們將提供一個 Compile類作為 Façade 對象。
【注釋 1】:Visual CMCS 是筆者主要設計和完成的一個 C_minus 語言(C 語言的一個子集)的編譯系統,該系統可以生成源 C-minus 程序的匯編代碼(并且可以獲得編譯中間階段的各個輸出,如:詞法、語法、語義中間代碼等。),并可執行。Visual CMCS 將作為一個對教學、學習、研究開源的項目,它更加重要的特性是提供了一個框架(framework),感興趣的開發人員可以實現、測試自己感興趣的模塊,而無需實現整個的編譯系統。VisualCMCS 采用 VC++ 6.0 的界面風格,更多內容請參見 Visual CMCS 網站。
外觀模式的實現
完整代碼示例(code):外觀模式的實現很簡單,這里為了方便初學者的學習和參考,將給出完整的實現代碼(所有代碼采用 C++實現,并在 VC 6.0 下測試運行)。代碼片斷 1:Façade.h
//Facade.h
#ifndef _FACADE_H_
#define _FACADE_H_
class Subsystem1{
public:
Subsystem1();
~Subsystem1();
void Operation();
protected:
private:
};
class Subsystem2{
public:
Subsystem2();
~Subsystem2();
void Operation();
protected:
private:
};
class Facade{
public:
Facade();
~Facade();
void OperationWrapper();
protected:
private:
Subsystem1* _subs1;
Subsystem2* _subs2;
};
#endif //~_FACADE_H_
代碼片斷 2:Façade.cpp
//Facade.cpp
#include "Facade.h"
#include <iostream>
using namespace std;
Subsystem1::Subsystem1(){
}
Subsystem1::~Subsystem1(){
}
void Subsystem1::Operation(){
cout<<"Subsystem2 operation.."<<endl;
}
Subsystem2::Subsystem2(){
}
Subsystem2::~Subsystem2(){
}
void Subsystem2::Operation(){
cout<<"Subsystem2 operation.."<<endl;
}
Facade::Facade(){
this->_subs1 = new Subsystem1();
this->_subs2 = new Subsystem2();
}
Facade::~Facade(){
delete _subs1;
delete _subs2;
}
void Facade::OperationWrapper(){
this->_subs1->Operation();
this->_subs2->Operation();
}
代碼片斷 3:main.cpp
//main.cpp
#include "Facade.h"
#include <iostream>
using namespace std;
int main(int argc,char* argv[]){
Facade* f = new Facade();
f->OperationWrapper();
return 0;
}
代碼說明:外觀模式的實現很簡單,多余的解釋完全是沒有必要。
關于外觀模式的討論
外觀模式在高層提供了一個統一的接口,解耦了系統。設計模式中還有另一種模式中介者也和外觀有類似的地方。但是中介者主要目的是對象間的訪問的解耦(通訊時候的協議)。
<上一節
下一節>