基本概念
(1)代理模型:为其他对象提供一种代理以控制这个对象的访问。
(2)代理模式的适用场景:远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实;虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象,从而达到性能优化的目的;安全代理,用来控制真实对象访问时的权限;智能指引,当调用真实的对象时,代理处理另外一些事。
(3)代理模式一般结构
Subject:定义了RealSubject 和 Proxy 的公共接口,这就在任何使用 RealSubject 的地方都可以使用Proxy
RealSubject类,定义Proxy 所代表的真实实体;
Proxy类,保存一个引用使得代理可以访问实体,并提供一个与Subject 的接口相同的接口,这样代理就可以用来替代实体。
具体案例
具体实现(VS,C++)
//#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
class SchoolGirl
{
public:
SchoolGirl();
~SchoolGirl();
SchoolGirl(string name) {
this->name = name;
}
string getName() {
return name;
}
void setName(string name) {
this->name = name;
}
private:
string name;
};
class GiveGift
{
public:
GiveGift();
~GiveGift();
virtual void giveDolls() = 0;
virtual void giveFlowers() = 0;
virtual void giveChocolate() = 0;
private:
};
class Presuit:public GiveGift
{
public:
Presuit();
~Presuit();
SchoolGirl myGirl;
Presuit(SchoolGirl myGirl) {
this->myGirl = myGirl;
}
void giveDolls() {
cout << myGirl.getName() << "送你洋娃娃" << endl;
}
void giveFlowers() {
cout << myGirl.getName() << "送你鲜花" << endl;
}
void giveChocolate() {
cout << myGirl.getName() << "送你巧克力" << endl;
}
private:
};
class Proxy:public GiveGift
{
public:
Proxy();
~Proxy();
Presuit littleDog;
Proxy(SchoolGirl myGirl) {
littleDog = Presuit(myGirl);
}
void giveDolls() {
littleDog.giveDolls();
}
void giveFlowers() {
littleDog.giveFlowers();
}
void giveChocolate() {
littleDog.giveChocolate();
}
private:
};
Presuit::Presuit()
{
}
Presuit::~Presuit()
{
}
SchoolGirl::SchoolGirl()
{
}
SchoolGirl::~SchoolGirl()
{
}
Proxy::Proxy()
{
}
Proxy::~Proxy()
{
}
GiveGift::GiveGift()
{
}
GiveGift::~GiveGift()
{
}
int main(int argc, char** argv)
{
SchoolGirl bestWish("徐念");
Proxy myBoy(bestWish);//中间代理(套娃)
myBoy.giveDolls();
myBoy.giveDolls();
myBoy.giveFlowers();
return 0;
}
关于作者
长期从事编程相关研究,涉及Qt、机械臂、轮式机器人、四足机器人的建模及仿真,可共同探讨编程相关问题,可指导课程设计及毕业设计,详询:QQ:2963325158