閱讀716 返回首頁    go 阿裏雲 go 技術社區[雲棲]


不要重複發明輪子: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)  RealizeClassFunction1函數改名了,甚至加了一個缺省參數了。

 

講了半天,基本上把“代理接口DLL”是一個什麼東東、如何實現講完了,但是最根本的問題還沒有回答——這重境界要解決什麼問題?

其實看完如何實現後,聰明的你基本上都能猜出要解決什麼問題了,當然就是第二重境界遺留的兩個問題了:

1)  修改類定義:例如增加一個成員變量。

2)  修改函數定義:例如增加一個函數參數,修改某個入參類型;

代理接口DLL通過代理模式(其實本質上就是一個指針)解決了上述兩個問題,把對外呈現和內部實現分別由不同的類實現,然後通過一個簡單的指針將兩個類連接起來。

 ========未完待續,後麵更精彩===========

最後更新:2017-04-02 00:06:45

  上一篇:go 幾個phpmvc框架
  下一篇:go php url相關函數