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) 尽量在组件接口中避免声明数据成员,仅定义对外方法,给予组件实现者最大限度的更改自由。

 

 

 

 

 

.

 

posted @ 2020-10-19 22:50  一匹夫  阅读(413)  评论(0编辑  收藏  举报