意图:将抽象部分与实现部分分离,使它们都可以独立的变化。(核心在抽象,为了应对变更才有了不同的实现)
示例代码:
接口类sample
sample.h
#pragma once
#include "boost/smart_ptr.hpp"
using namespace boost;
class imp;//只需要声明无需包含源文件
class sample
{
public:
sample(void);
~sample(void);
void print(void) const;
private:
//当sample析构的时候会先调用成员变量的析构
//pimp_的析构会引发引用计数为0,从而调用imp对象的析构
boost::shared_ptr<imp> pimp_;
};
sample.cpp
#include "sample.h"
//必须包含定义
#include "imp.h"
#include<iostream>
using namespace std;
sample::sample(void):pimp_(new imp)//构造函数完成初始化,shared_ptr接受new返回的指针
{
cout<<"sample()"<<endl ;
}
sample::~sample(void)
{
cout<<"~sample()"<<endl ;
}
void sample::print(void) const
{
this->pimp_->imp_print();//桥接:将业务类与实现类隔离开来
}
实现类imp
imp.h
#pragma once
//没必要继承sample
class imp
{
public:
imp(void);
~imp(void);
void imp_print(void) const;
};
imp.cpp
#include "imp.h"
#include<iostream>
using namespace std;
//这里修改之后的编译不会影响sample,以及main的重新编译
imp::imp(void)
{
cout<<"imp()"<<endl ;
}
imp::~imp(void)
{
cout<<"~imp()"<<endl;
}
void imp::imp_print(void) const
{
cout<<"imp::pint()"<<endl;
}
bridge_main.cpp
#include "sample.h"
int main(int,char**)
{
sample s;
s.print();
return 0;
};