天天看點

pimp技法淺析--實作輕量級的面向接口程式設計

pimp.hpp:

#ifndef pimp_hpp
#define pimp_hpp


class CMyComponent{
public:
    CMyComponent();
    ~CMyComponent();

    void DoSomething();

private:
    class CMyComponentImpl;
    CMyComponentImpl* m_impl;
};



#endif      

pimp.cpp:

#include <iostream>
#include <pimp.hpp>

using namespace std;

class CMyComponent::CMyComponentImpl{
public:
    CMyComponentImpl(){
        
    }
    ~CMyComponentImpl(){

    }
    
    void DoSomething(){

        cout << "do something" << endl;
    }
};


CMyComponent::CMyComponent():m_impl(new CMyComponentImpl){

}

CMyComponent::~CMyComponent(){
    delete m_impl;
}

void CMyComponent::DoSomething(){
    m_impl->DoSomething();
}

int main(){

   CMyComponent obj;
   obj.DoSomething();

   return 0;
}      

編譯運作:

root@lmw-virtual-machine:/home/lmw/桌面/CPP_Text/pimp# g++ pimp.cpp -I. -o ab
root@lmw-virtual-machine:/home/lmw/桌面/CPP_Text/pimp# 
root@lmw-virtual-machine:/home/lmw/桌面/CPP_Text/pimp# 
root@lmw-virtual-machine:/home/lmw/桌面/CPP_Text/pimp# ./ab
do something
root@lmw-virtual-machine:/home/lmw/桌面/CPP_Text/pimp#       

在以上示例代碼中,

我們定義了元件類CMyComponent,同時定義了私有嵌套類CMyComponentImpl,

我們的對外接口DoSomething的實作代碼被轉發到了内部類CMyComponentImpl,

這樣做的實作的效果是:

客戶僅需要面向CMyComponent,而CMyComponent的實作被隔離到内部CMyComponentImpl類中。

隻要保持CMyComponent類的公共接口不變,則客戶代碼不需要重新編譯!

例如,我們在内部實作中添加一個資料成員,此時雖然内部類的對象尺寸發生了變化,但是我們的客戶卻不需要重新編譯。

這種隔離措施,使我們的元件開發者可以随意改變元件的内部實作代碼而不會影響到客戶,這也是面向接口程式設計的精髓之處。

結論:

1) 善用pimp技法,可以實作接口與實作隔離,防止客戶代碼的不必要重新編譯。

2) pimp内部通過轉發實作,有一定的運作時性能損失,但我們得到的卻是代碼的封裝和可維護性。

3) 盡量在元件接口中避免聲明資料成員,僅定義對外方法,給予元件實作者最大限度的更改自由。

.

/************* 社會的有色眼光是:博士生、研究所學生、大學生、工廠中的房間勞工; 重點大學高材生、普通院校、二流院校、野雞大學; 年薪百萬、五十萬、五萬; 這些都隻是帽子,可以失敗千百次,但我和社會都覺得,人隻要成功一次,就能換一頂帽子,隻是社會看不見你之前的失敗的帽子。 當然,換帽子決不是最終目的,走好自己的路就行。 杭州.大話西遊 *******/

繼續閱讀