[大话设计模式] 第7章: 代理模式
代理模式(Proxy)
- 代理模式:为其他对象提供一种代理以控制对这个对象的访问。实际上是在访问对象时引入一定程度的间接性。
- 远程代理:为一个对象在不同地址空间提供局部代表,隐藏一个对象存在于不同空间的事实。如.Net加入Web引用,引入WebService,此时项目会生成WebReference的文件夹,就是代理。
- 虚拟代理:根据需要创建开销很大的对象,通过它存放实例化需很长时间的真实对象。HTML中的多图,就是通过虚拟代理代替了真实图片,存储路径和尺寸。
- 安全代理:控制真实对象的访问权限,用于对象应该拥有不同的访问权限时。
- 智能指引:当调用真实对象时,代理处理一些另外的事情。通过代理在访问对象时增加一些内务处理。
UML类图
场景描述: 某追求者(Pursuit类)追求女同学(SchoolGirl类), 但是由于不在一个班不能直接给女同学送礼物, 需要一个代理(Proxy类)帮忙送礼物.
UML类图
代码实现
#include <iostream>
#include <string>
using namespace std;
// 被追求者类
class SchoolGirl
{
public:
SchoolGirl() {}
SchoolGirl(string n) : name(n){}
string get_name(){ return name; }
private:
string name;
};
// 代理与追求者公共接口
class IGiveGift
{
public:
virtual void give_dolls() = 0;
virtual void give_flowers() = 0;
virtual void give_chocolate() = 0;
};
// 追求者类
class Pursuit : public IGiveGift
{
public:
Pursuit(SchoolGirl *sg) : mm(sg){ }
void give_dolls();
void give_flowers();
void give_chocolate();
private:
SchoolGirl *mm;
};
void Pursuit::give_dolls()
{
cout << "Give dolls to " << mm->get_name() << endl;
}
void Pursuit::give_flowers()
{
cout << "Give flowers to " << mm->get_name() << endl;
}
void Pursuit::give_chocolate()
{
cout << "Give chocolate to " << mm->get_name() << endl;
}
// 代理类
class Proxy : public IGiveGift
{
public:
Proxy(SchoolGirl *mm);
~Proxy();
void give_dolls();
void give_flowers();
void give_chocolate();
private:
Pursuit *gg;
};
Proxy::Proxy(SchoolGirl *mm)
{
gg = new Pursuit(mm);
}
Proxy::~Proxy()
{
delete gg;
}
void Proxy::give_dolls()
{
gg->give_dolls();
}
void Proxy::give_flowers()
{
gg->give_flowers();
}
void Proxy::give_chocolate()
{
gg->give_chocolate();
}
// 客户端
int main()
{
SchoolGirl s_girl("娇娇");
Proxy daili(&s_girl);
daili.give_flowers();
daili.give_dolls();
daili.give_chocolate();
return 0;
}
/* 输出
Give flowers to 娇娇
Give dolls to 娇娇
Give chocolate to 娇娇
*/
http://www.cnblogs.com/moon1992/