07 大话设计模式C++实现之代理模式
# 类图
/*
代理模式:
例子:追女生让别人帮忙送礼物,就是通过代理完成业务
代理实现接口,代理类关联于追求者类,也就是说代理的业务主要取决于请求者
代理与请求者实现相同的接口,因此利用纯虚函数实现接口类
*/
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
using namespace std;
//定义要追的女生
class SchoolGirl
{
private:
string name;
public:
string getName()
{
return this->name;
}
void setName(string value)
{
this->name = value;
}
};
//定义接口类IGiveGift
class IGiveGift
{
public:
//C++实现接口的方法是利用纯虚函数
virtual void GiveDolls() = 0;
virtual void GiveFlowers() = 0;
virtual void GiveChocolate() = 0;
};
//请求者(追求者)
class Pursuit : public IGiveGift
{
private:
SchoolGirl mm;
public:
Pursuit(SchoolGirl &mm)
{
this->mm = mm;
}
virtual void GiveDolls()
{
cout << mm.getName() << "送你一个娃娃!" << endl;
}
virtual void GiveFlowers()
{
cout << mm.getName() << "送你一束花! " << endl;
}
virtual void GiveChocolate()
{
cout << mm.getName() << "送你巧克力! " << endl;
}
};
//代理
class Proxy : public IGiveGift
{
//让代理也实现送礼物的接口
private:
Pursuit *gg;
public:
Proxy(SchoolGirl &mm)
{
gg = new Pursuit(mm);
}
//在实现的过程中去调用追求者的方法
virtual void GiveDolls()
{
gg->GiveDolls();
}
virtual void GiveFlowers()
{
gg->GiveFlowers();
}
virtual void GiveChocolate()
{
gg->GiveChocolate();
}
};
//客户端实现代码
void Client()
{
SchoolGirl *tian = new SchoolGirl; //在堆上开辟对象
tian->setName("美女");
Proxy *good_man = new Proxy(*tian);
good_man->GiveChocolate();
good_man->GiveDolls();
good_man->GiveFlowers();
if (tian != NULL) {
delete tian;
tian = NULL;
}
if (good_man != NULL)
{
delete good_man;
good_man = NULL;
}
}
int main()
{
Client();
system("pause");
return EXIT_SUCCESS;
}
/*
代理模式应用总结:
1. 远程代理:
就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实
应用实例:WebService在.NET中的应用,在应用程序项目中加入一个Web引用,引用一个WebService,此时会在项目中生成WebReference的文件夹
和一些文件,其实他们就是代理,这就可以解决远程访问的问题。
2. 虚拟代理:
根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象
例子:打开一个网页时,里面可能有很多文字和图片,但是可以很快打开这个网页,文字一下就能看到,而图片则是一张一张加载的。那些未打开
的图片框就是虚拟代理代替了真实的图片用于优化下载过程
3. 安全代理
用来控制真实对象的访问时的权限
一般用于对象应该有不同的访问权限的时候
4. 智能指引
是指当调用真实的对象时,代理会处理另外一些事情。
例子:计算真实对象的引用次数,这样当该对象没有引用时,可以自动释放他;或当第一次引用一个持久对象时,将它装入内存;或在访问第一个
实际对象前,检查是否已经锁定他,以确保其他对象不能引用它。它们都是通过代理在访问一个对象时附加一些内务处理
*/