代理模式,控制对一个对象的访问。为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
#include <iostream>
#include <memory>
#include <string>
using namespace std;
/* 代理模式
* 为其他对象提供一种代理以控制对这个对象的访问,很类似装饰模式,但是这个主要的
* 是控制对对象的访问
*/
/*
* 代理模式可以分为
* 远程代理:也就是为了一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同
地址空间的事实,类似网络代理。
* 虚拟代理:是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象,
在需要时,在在代理中进行创建。
* 安全代理:用来控制真实对象访问的权限。
* 智能指引:是指当调用真实的对象时,代理处理另外一些事。
*/
class CImage
{
public:
CImage(std::string name):m_name(name) {}
virtual ~CImage() { }
virtual void Show() = 0;
protected:
string m_name;
};
class CBigImage : public CImage
{
public:
CBigImage(std::string name):CImage(name) {}
~CBigImage() { cout << "析构被调用" << endl; }
virtual void Show() { cout << "CBigImage Show " << m_name << endl; }
private:
};
//代理
class CBigImageProxy : public CImage
{
public:
CBigImageProxy(std::string name) :CImage(name), m_BigImage(nullptr)
{
}
virtual void Show()
{
if (nullptr == m_BigImage)
{
m_BigImage = std::make_shared<CBigImage>(this->m_name);
//m_BigImage.reset(new CBigImage(this->m_name));
}
m_BigImage->Show();
}
private:
std::shared_ptr<CBigImage> m_BigImage;
};
int main()
{
std::unique_ptr<CImage> proxy = std::make_unique<CBigImageProxy>("hello");
proxy->Show();
return 0;
}