您的位置:首页 > 其它

[大话设计模式] 第7章: 代理模式

2017-08-16 17:08 288 查看

代理模式(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 娇娇
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: