从师兄那里学到的一种思想简单有效的设计模式, PIMPL即Private Implementation或Pointer to Implementation, 指的是通过一个私有的类成员指针, 将指针所指向的类的实现隐藏起来。
还是先举个栗子叭~
//A.h
class A
{
public:
void fun();
private:
int i;
};
//B.h
#include "A.h"
class B
{
public:
void fun();
private:
A a; //与A的强耦合
};
//PIMPL做法:
//B.h
class A; //代替#include "A.h"
class B
{
public:
void fun();
private:
A* pImpl;
};
//B.cpp
B::B()
pImpl(new A()){
}
B::~B()
{
delete pImpl;
pImpl = nullptr;
}
void B::fun()
{
pImpl->fun();
}
//main.cpp #includeint main() { B b; b.fun(); return 0; }
这样做的好处有:
1) 降低模块的耦合; 降低编译依赖, 提高编译速度. 因为隐藏了A的实现, 被隐藏的A相当于类B是不可见的. 当我们对隐藏的A进行修改时, 是不需要重新编译类B的.
2) 接口与实现分离, 提高接口的稳定性.
a. 通过指针封装, 当定义new B或B b时, 编译器生成的代码中不会掺杂A的任何信息.
b. 当使用B时, 使用的是B的接口(B接口里面操作的类其实是pImpl成员指向的A对象, 与A无关, A被通过指针封装彻底的与实现分离.