代理模式定义
C++中的代理模式(Proxy Pattern)是一种结构型设计模式,它允许通过引入一个代理对象来控制对另一个对象的访问。
代理模式通常涉及以下几个角色:
1.抽象主题(Subject):定义了真实主题和代理主题的共同接口,这样代理可以在任何时候都可以替代真实主题。
2.真实主题(Real Subject):是实际执行业务逻辑的对象,代理将请求委托给真实主题。
3.代理(Proxy):拥有与真实主题相同的接口,它可以访问、控制或者扩展真实主题的功能。代理对象持有真实主题对象的引用,并在必要时创建、管理或销毁真实主题对象。
使用代理模式的主要目的是在不修改现有代码的情况下,为对象提供额外的功能或控制对对象的访问。代理可以在真实主题执行前后进行一些预处理或后处理操作,例如权限验证、缓存、延迟加载等。代理还可以隐藏真实主题的细节,将客户端与真实主题解耦,从而提高代码的灵活性和可维护性。
实例应用场景:
VPN架梯子访问外网
电话虫代码实例
电话虫是代理,人是真实主题
cpp
#include<iostream>
using namespace std;
//抽象通信类
class Communication
{
public:
virtual void comminicate() = 0; //通话
virtual ~Communication() {}
};
//然后在根据这个抽象类,派生出两个子类:讲话者类和电话虫类
/*幕后讲话的人*/
class Speaker :public Communication
{
public:
void comminicate() override
{
cout << "开始说话..." << endl;
cout << "通话时发生了一些列的表情变化..." << endl;
}
};
/*代理:电话虫*/
class DenDenMushi :public Communication
{
public:
DenDenMushi()
{
m_isStart = true;
m_speaker = new Speaker; //幕后讲话的人
}
~DenDenMushi()
{
if (m_speaker != nullptr)
{
delete m_speaker;
}
}
bool isStart()
{
return m_isStart;
}
void comminicate()
{
if (isStart())
{
cout << "======" << endl;
m_speaker->comminicate();
}
}
private:
bool m_isStart = false; //是否开始讲话
Speaker * m_speaker = nullptr;
};
int main()
{
//直接交流
Speaker* s = new Speaker();
s->comminicate();
delete s;
//代理讲话
DenDenMushi* d = new DenDenMushi();
d->comminicate();
delete d;
return 0;
}