大话设计模式
1 代理模式UML图
2 代理模式的一些解释
概念:为其他对象提供一种代理以控制对这个对象的访问。【DP】
Subject类,定义了RealSubject和Proxy的公共接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
class Subject
{
public:
virtual void Request() = 0;
};
RealSubject类,定义Proxy所代表的真实实体。
class RealSubject :public Subject
{
public:
void Request() override
{
cout << "真实的请求" << endl;
}
};
Proxy类,保存一个引用使得代理可以访问实体,并提供一个与Subject的接口相同的接口,这样代理就可以用来替代实体。
class Proxy :public Subject
{
private:
RealSubject *rs = nullptr;
public:
void Request() override
{
if (rs == nullptr)
{
rs = new RealSubject();
}
rs->Request();
}
};
客户端代码:
int main()
{
Proxy *proxy = new Proxy();
proxy->Request();
return 0;
}
代理模式的应用:
- 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理,是根据需要创建开销很大的对象。通过他来存放实例化需要很长时间的真实对象。例如:图片加载的时候。
- 安全代理,用来控制真是对象访问时的权限。
- 智能指引,是指当调用真实的对象的时候,代理处理另外一些事。
代理模式的实质:代理模式其实就是在访问对象的时候引入了一定程度的间接性,因为这种间接性,可以附加多种用途。
3 C++代码实现
问题描述:男同学B作为男同学A的代理向女同学送礼物。
C++源代码:
#include<iostream>
#include<string>
using namespace std;
class ShchoolGirl
{
private:
string name;
public:
ShchoolGirl(){}
ShchoolGirl(string na)
{
this->name = na;
}
void setName(string na)
{
name = na;
}
string getName()
{
return name;
}
};
//代理接口
class IGiveGift
{
public:
virtual void GiveDolls() = 0;
virtual void GiveFlowers() = 0;
virtual void GiveChocolate() = 0;
};
//真正追求者
class Persuit :public IGiveGift
{
private:
ShchoolGirl *sg = nullptr;
public:
Persuit(){}
Persuit(ShchoolGirl *sg2)
{
this->sg = sg2;
}
void GiveDolls() override
{
cout << sg->getName() << "\t送你洋娃娃" << endl;
}
void GiveFlowers() override
{
cout << sg->getName() << "\t送你花" << endl;
}
void GiveChocolate() override
{
cout << sg->getName() << "\t送你巧克力" << endl;
}
};
//代理类
class Proxy :public IGiveGift
{
private:
Persuit *ps = nullptr;
public:
Proxy(){}
Proxy(ShchoolGirl *mm)
{
ps = new Persuit(mm);
}
void GiveDolls() override
{
ps->GiveDolls();
}
void GiveFlowers() override
{
ps->GiveFlowers();
}
void GiveChocolate() override
{
ps->GiveChocolate();
}
};
int main()
{
ShchoolGirl *sg = new ShchoolGirl("小花");
Proxy *po = new Proxy(sg);
po->GiveDolls();
po->GiveFlowers();
po->GiveChocolate();
system("pause");
return 0;
}
运行结果:
小花 送你洋娃娃
小花 送你花
小花 送你巧克力
请按任意键继续. . .
说明:在这个程序中,小花并不认识Persuit,但却可以通过代理热得到礼物!