PIMPL模式

从师兄那里学到的一种思想简单有效的设计模式, 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
#include 
int 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被通过指针封装彻底的与实现分离.

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注