代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问
Subject定义RealSubject和Proxy的共用接口,这样就可以在任何使用RealSubject的地方使用Proxy。
isubject.h
#pragma once
class ISuject
{
public:
virtual ~ISuject() {}
virtual void Request() = 0;
};
RealSubject类,定义Proxy所代表的真实实体
#pragma once
#include "isubject.h"
#include <iostream>
class RealSubject : public ISuject
{
public:
void Request() override
{
std::cout << "真实的请求..." << std::endl;
}
};
Proxy类,保存一个实体的指针或者引用,让代理可以访问实体,并提供一个与Subject的接口相同的接口。这样代理就可以用来替代实体。
proxy.h
#pragma once
#include "isubject.h"
#include "realSubject.h"
class Proxy : public ISuject
{
public:
void Request() override
{
if (m_pRealSubject == nullptr)
{
m_pRealSubject = new RealSubject();
}
m_pRealSubject->Request();
}
~Proxy()
{
if (m_pRealSubject != nullptr)
{
delete m_pRealSubject;
m_pRealSubject = nullptr;
}
}
private:
RealSubject *m_pRealSubject;
};
客户端main.cpp:
#include "proxy.h"
int main()
{
Proxy *proxy = new Proxy();
proxy->Request();
delete proxy;
getchar();
return 0;
}
运行结果:
真实的请求...
我们再看一下书中的例子:某男生想追求一个女生,但是又不好意思自己去给女生送礼物,于是通过一个中间人去给女生送礼物,这个中间人就是代理。
首先是定义一个真实实体和代理相同的一个共用接口
iGiveGift.h
#pragma once
class IGiveGift
{
public:
virtual ~IGiveGift() {}
virtual void GiveDolls() = 0;
virtual void GiveFlowers() = 0;
virtual void GiveCHocolate() = 0;
};
追求者实体pursuit.h
#pragma once
#include "iGiveGift.h"
#include "schoolGirl.h"
#include <iostream>
class Pursuit : public IGiveGift
{
public:
Pursuit(SchoolGirl *girl)
{
m_girl = girl;
}
void GiveDolls() override
{
std::cout << m_girl->GetName() << " 送你洋娃娃" << std::endl;
}
void GiveFlowers() override
{
std::cout << m_girl->GetName() << " 送你鲜花" << std::endl;
}
void GiveCHocolate() override
{
std::cout << m_girl->GetName() << " 送你巧克力" << std::endl;
}
private:
SchoolGirl *m_girl;
};
代理proxy.h
#pragma once
#include "iGiveGift.h"
#include "schoolGirl.h"
#include "pursuit.h"
#include <iostream>
class Proxy : public IGiveGift
{
public:
Proxy(SchoolGirl *girl)
{
m_pursuit = new Pursuit(girl);
}
~Proxy() override
{
delete m_pursuit;
}
void GiveDolls() override
{
m_pursuit->GiveDolls();
}
void GiveFlowers() override
{
m_pursuit->GiveFlowers();
}
void GiveCHocolate() override
{
m_pursuit->GiveCHocolate();
}
private:
Pursuit *m_pursuit;
};
被追求者schoolGirl.h
#pragma once
#include <string>
class SchoolGirl
{
public:
std::string GetName()
{
return m_name;
}
void SetName(const std::string &name)
{
m_name = name;
}
private:
std::string m_name;
};
客户端main.cpp
#include "proxy.h"
int main()
{
SchoolGirl *girl = new SchoolGirl();
girl->SetName("李娇娇");
Proxy *proxy = new Proxy(girl);
proxy->GiveDolls();
proxy->GiveFlowers();
proxy->GiveCHocolate();
getchar();
return 0;
}
运行结果:
李娇娇 送你洋娃娃
李娇娇 送你鲜花
李娇娇 送你巧克力