01 使用场景
不想让一个类暴露,去填充一个接口需求,这时就构建一个代理类,他封装被代理对象完成实际的调用需要。
02 构建方法
- 构建一个只含纯虚方法的基类,被代理类和代理类都是该基类的派生类。
- 被代理类重写基类的方法。
- 代理类
- 内含一个基类类型的指针,实际后续指向堆上的被代理类实例。
- 构造函数接受一个基类类型的指针,实际指向堆上的被代理类实例,并用该指针初始化自身内含的基类指针。
- 重写基类的函数,而实际上是利用内含的指针调用被代理类重写完毕的方法。
03 Show me the code
#include <iostream>
using namespace std;
// 传话员基类
class Deliver_base {
public:
virtual ~Deliver_base() {}
virtual void give_info() const = 0;
};
// 传话长 —— 被代理类
class Deliver_captain: public Deliver_base {
public:
void give_info() const {
cout << "后面的队伍跟上" << endl;
}
};
// 传话临时工 —— 代理类
class Deliver_temper: public Deliver_base {
private:
// 代理类内含一个基类的引用,后面该引用指向被代理类的实例
Deliver_base * fact = nullptr;
public:
// 析构
~Deliver_temper() {
fact = nullptr;
}
// 构造函数接受一个基类类型的指针
Deliver_temper(Deliver_base* outer)
:fact(outer)
{}
// 包装代理对象的函数
void give_info() const {
fact->give_info();
}
};
int main() {
// 被代理类的实例
Deliver_base* real = new Deliver_captain();
// 创建代理类
Deliver_temper* proxy = new Deliver_temper(real);
// 通过代理类调用相应函数
proxy->give_info();
delete real;
delete proxy;
}