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) 尽量在组件接口中避免声明数据成员,仅定义对外方法,给予组件实现者最大限度的更改自由。
.
/************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/