PImpl的全程是:“Pointer to Implementation”,主要用于隐藏一个类的实现细节。在C 中通过将类的实现细节移到一个单独的类,主类通过包含该类的指针实现功能的调用,从而完成隐藏类实现的功能。
实现方式如下:
代码语言:javascript复制class VideoControl{
public:
virtual void doSomething() = 0;
virtual ~VideoControl() = default;
};
class VideoControlImpl : public VideoControl {
public:
void doSomething();
};
class Widget {
public:
Widget();
~Widget();
void doSomething();
private:
VideoControl* pImpl;
};
如上,上面的代码我们要实现的功能是对外提供一个doSomething()的方法,但是又想对外隐藏实现的细节。因此在实现过程中,定义了一个抽象类VideoControl,然后创建了一个实现类VideoControlImpl 实现具体的功能,从而达到对外隐藏实现的细节。
Impl模式常被应用于SDK的开发中,日常以SDK的方式给第三方进行使用,在大型项目中使用除了上述的优点外还具备以下特点:
- 减少编译依赖:实现类的头文件发生改变时,只有实现类需要重新编译,主类可以保持不变,从而减少了编译时间。
- 降低编译时间:由于只有实现类需要重新编译,因此在大型项目中使用PImpl模式可以显著减少整体的编译时间