意图:为其他对象提供一种代理以控制对这个对象的访问
动机:为了只有在我们确实需要这个对象时才对它进行创建和初始化用一个proxy替代那个对象并在需要的时候实例化这个对象
适用性:在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用代理(Proxy)模式
示例图:
听众听人演讲,演讲者通过扩音器来演说,扩音器起来的了一个中间代理的作用.
示例代码:
//演讲者基类
class CSpeaker
{
public:
CSpeaker(void);
public:
~CSpeaker(void);
public:
//演说接口
virtual void Speak()=0;
};
//英文演说家
class CEnglishSpeaker:public CSpeaker
{
public:
CEnglishSpeaker()
{
//演说家初始化完毕
_tprintf(_T("English speaker initlized/n"));
}
~CEnglishSpeaker()
{
}
public:
virtual void Speak()
{
//演说家演说
_tprintf(_T("The eglish speaker speak in english/n"));
}
};
//扩音器代理演说家给听众发送声音
class CLoudSpeaker:public CSpeaker
{
public:
CLoudSpeaker()
:CSpeaker(),m_pSpeaker(NULL)
{
}
~CLoudSpeaker()
{
}
protected:
//找到一个演说家
CSpeaker* GetSpeaker()
{
if(m_pSpeaker == NULL)
{
m_pSpeaker = new CEnglishSpeaker();
}
return m_pSpeaker;
}
public:
//演说接口
virtual void Speak()
{
GetSpeaker()->Speak();
}
private:
CSpeaker* m_pSpeaker;
};
//听众
class CAudience
{
public:
CAudience(void);
public:
~CAudience(void);
public:
//听众准备听某个演说家演说
virtual void ListenTo(CSpeaker* speaker)
{
_tprintf(_T("Audience ready listen to speaker speaking/n"));
m_speaker = speaker;
}
//开始听演说
virtual void ListeningSpeak()
{
_tprintf(_T("Audience listening/n"));
m_speaker->Speak();
}
private:
CSpeaker* m_speaker;
};
CLoudSpeaker* pSpeaker = new CLoudSpeaker();
CAudience audience;
audience.ListenTo(pSpeaker);
audience.ListeningSpeak();
运行结果显示只有实际开始演说是才实例化演说家对象