代理模式UML图:
Subject:实例和代理的共用接口,使得在任何使用RealSubject的地方都可以使用Proxy;
RealSubject:实例;
Proxy:代理,它与RealSubject为依赖关系
代理模式代码示例:
代理接口类、实例类、代理类及client类定义和实现如下:
proxy.h
#ifndef PROXY_H
#define PROXY_H
#include <iostream>
#include <string>
using namespace std;
//代理接口
class GiveGift
{
virtual void GiveDolls()=0;
virtual void GiveFlowers()=0;
virtual void GiveChocolate()=0;
};
//被追求者类
class SchoolGirl
{
private:
string name;
public:
SchoolGirl(string strname){name = strname;}
string getName(){return name;}
};
class Pusuit:public GiveGift
{
private:
SchoolGirl *mm;
public:
//追求者是真正给女孩送礼物的对象
Pusuit(SchoolGirl *mm1):mm(mm1){}
void GiveDolls(){cout << "Give " << mm->getName() << " dolls" << endl;}
void GiveFlowers(){cout << "Give " << mm->getName() << " flowers" << endl;}
void GiveChocolate(){cout << "Give " << mm->getName() << " chocolate" << endl;}
};
class Proxy:public GiveGift
{
private:
Pusuit *gg;
public:
//追求者通过代理间接给女孩送礼物
Proxy(SchoolGirl *mm1)
{
gg=new Pusuit(mm1);
}
//在代理的实现方法中实际调用的是追求者的相关方法
void GiveDolls(){gg->GiveDolls();}
void GiveFlowers(){gg->GiveFlowers();}
void GiveChocolate(){gg->GiveChocolate();}
};
#endif
客户端代码如下:
#include "proxy.h"
int main()
{
SchoolGirl *mm = new SchoolGirl("jiaojiao");
Proxy *daili = new Proxy(mm);
daili->GiveDolls();
daili->GiveFlowers();
daili->GiveChocolate();
return 0;
}
代码输出如下:
代理模式的适用场合:
(1)远程代理:为一个对象在不同的地址空间提供局部对象;例:webservice在.net中的应用;
(2)虚拟代理:根据需要创建开销很大的对象,通过它来创建实例化需要很长时间的对象;例:浏览器中优化下载图片;
(3)安全代理:用来控制真是对象访问时的权限;
(4)智能指引:当调用真实的对象时,代理用来处理另外一些事;
总结:代理模式是在访问对象中引入一定程度的间接性,因为这种间接性,可以附加很多用途;
代理就是真实对象的代表;