不要重複發明輪子:C++重用的5重境界(3)——代理接口DLL
第三重境界:代理接口DLL
看到這個名字,可能大家有點迷煳:代理?接口?DLL?三個風馬牛不相及的東東扯到一塊是什麼意思呢?
其實隻要按照字麵意思就能夠大概理解:
代理:就是設計模式中的代理模式;
接口:就是Java中的Interface一個概念;
DLL:就是動態鏈接庫了:)
翻譯成一句完整的話就是:DLL通過代理模式對外提供接口。
下麵我們看看這個“代理接口DLL”是如何實現的。
/*******************************DLL代碼*********************************/
//聲明部分
class __decspec(dllexport) InterfaceClass{ //聲明接口類
class RealizeClass; //引入實現類
RealizeClass* m_pRealizeClass; //指向實現類的指針,咦,怎麼會有數據?
public:
void Function1(int param1, char param2 );
void Function2(int param1;
void Function3(bool param1, char param2 );
……………………………………………….
}
//實現部分
InterfaceClass::InterfaceClass(){
m_pRealizeClass = new RealizeClass();
}
InterfaceClass:: Function1(int param1, char param2 ){
return m_pRealizeClass-> Function1(param1, param2 );
}
//其它函數略。
/*******************************DLL代碼*********************************/
/***************************使用DLL的客戶端代碼********************/
InterfaceClass pInterfaceClass = new InterfaceClass();
pInterfaceClass->Function1(param1, param2);
/***************************使用DLL的客戶端代碼********************/
各位看完上麵的樣例,基本上應該都能夠明白是如何實現的,但可能會問“為什麼還是有一個指針數據類型呢”?不是說沒成員數據的嗎?
是的,這裏關鍵就在於這個指針,雖然有這個成員數據,但是大家想一想,指針是一個固定大小的類型,而且客戶端程序是看不到這個指針的。因此不管對於以下哪個變化,InterfaceClass的結構都不變化,客戶端的代碼也不受任何影響,不需要重新編譯。
1) 具體實現的RealizeClass增加、修改、刪除成員數據;
2) RealizeClass有一天改了名稱變成了RealizeClassSE;
3) RealizeClass的Function1函數改名了,甚至加了一個缺省參數了。
講了半天,基本上把“代理接口DLL”是一個什麼東東、如何實現講完了,但是最根本的問題還沒有回答——這重境界要解決什麼問題?
其實看完如何實現後,聰明的你基本上都能猜出要解決什麼問題了,當然就是第二重境界遺留的兩個問題了:
1) 修改類定義:例如增加一個成員變量。
2) 修改函數定義:例如增加一個函數參數,修改某個入參類型;
代理接口DLL通過代理模式(其實本質上就是一個指針)解決了上述兩個問題,把對外呈現和內部實現分別由不同的類實現,然後通過一個簡單的指針將兩個類連接起來。
========未完待續,後麵更精彩===========
最後更新:2017-04-02 00:06:45