您的位置:首页 > 其它

设计模式学习-Proxy(代理模式)

2011-05-13 00:16 549 查看
意图:为其他对象提供一种代理以控制对这个对象的访问

动机:为了只有在我们确实需要这个对象时才对它进行创建和初始化用一个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();

运行结果显示只有实际开始演说是才实例化演说家对象

.png]


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: