代理模式(Proxy):
对其他对象提供一种代理以控制对这个对象的访问。
1.远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
2.虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
3.安全代理,用来控制真实对象访问时的权限。
4.智能指引,是指当调用真实的对象时,代理处理另外一些事。
接下来实现一下上面的UML对应的代码:
策略模式实现代码:
#pragma once
#include <iostream>
using namespace std;
class CProxyInterface
{
public:
virtual void DoFun1() = 0;
virtual void DoFun2() = 0;
virtual void DoFun3() = 0;
};
class CDoFunA : public CProxyInterface
{
public:
void DoFun1()
{
cout<<"do fun1"<<endl;
}
void DoFun2()
{
cout<<"do fun2"<<endl;
}
void DoFun3()
{
cout<<"do fun3"<<endl;
}
};
class CProxy : public CProxyInterface
{
private:
CProxyInterface *m_pMyBody;
public:
CProxy(CProxyInterface *pMyBody)
{
m_pMyBody = pMyBody;
}
~CProxy()
{
delete m_pMyBody;
}
void DoFun1()
{
m_pMyBody->DoFun1();
}
void DoFun2()
{
m_pMyBody->DoFun2();
}
void DoFun3()
{
m_pMyBody->DoFun3();
}
};
客户端调用代码:
#include "stdafx.h"
#include "Proxy.h"
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
CProxyInterface *pProxy = new CProxy(new CDoFunA());
pProxy->DoFun1();
pProxy->DoFun2();
pProxy->DoFun3();
delete pProxy;
return 0;
}
执行结果:
总结:
代理模式应用很多,可以通过代理中转这个逻辑增加一层执行流程,这样我们方便在这个策略层里面增加和扩展,比如增加文件夹权限制等等,我刚写完的时候看着客户端代码想了几分钟,他策略理模式很像,几乎一样,策略模式注重的是对象之间的替换,而代理则是注重平等函数之间的代替。
策略VS代理