#ifndef __PROXY_H__
#define __PROXY_H__
#include <string>
//【定义】
// 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
//【角色】
// 1) 抽象主题:通过接口或抽象类声明业务方法。
// 2) 代理角色:继承抽象主题,提供与抽象主题相同的接口;包含对真实主题对象的引用,在上下文中附加额外的操作。
// 3) 真实主题:实现抽象主题,定义要实现的业务逻辑,供代理角色调用。
//【意义】
// 代理主题角色内部含有对真实主题的引用,提供一个与真实主题相同的接口,从而可以在任何时候替代真实主题对象。
// 主题类和代理类是独立的组件,ConcreteSubject类并不知道Proxy类的存在,在进行修改时也不会相互之间产生影响(分而治之)。
//【示例】
//抽象主题
class iSubject
{
public:
iSubject(){ }
virtual ~iSubject(){ }
public:
virtual void Proc(const std::string & value) = 0;
};
//真实主题
class ConcreteSubject : public iSubject
{
public:
virtual void Proc(const std::string & value);
};
//代理
class Proxy : public iSubject
{
public:
Proxy();
~Proxy();
public:
void DoSomething1();;
void DoSomething2();;
virtual void Proc(const std::string & value);
private:
iSubject * m_subject;
};
void TestProxy();
#endif
#include "Proxy.h"
void ConcreteSubject::Proc(const std::string & value)
{
printf("ConcreteSubject Proc %s \n",value.c_str());
}
Proxy::Proxy()
{
m_subject = NULL;
}
Proxy::~Proxy()
{
if (m_subject)
{
delete m_subject;
m_subject = NULL;
}
}
void Proxy::DoSomething1()
{
printf("------------------------------------------ \n");
}
void Proxy::DoSomething2()
{
printf("------------------------------------------ \n");
}
void Proxy::Proc(const std::string & value)
{
this->DoSomething1();
if (NULL == m_subject)
{
m_subject = new ConcreteSubject();
}
m_subject->Proc(value);
this->DoSomething2();
}
void TestProxy()
{
iSubject * proxy = new Proxy();
proxy->Proc("12345");
delete proxy;
}