代理模式
为其他对象提供一种代理以控制对这个对象的访问。
本文使用书中追求者代理的例子,代码使用C++语言描述,代码存在的不足或问题有望各位指出。
(1)首先我们看一下代理模式框架代码
//代理模式
#include <iostream>
using namespace std;
class Subject
{
public:
Subject(){}
virtual ~Subject(){}
virtual void Request()=0;
};
class RealSubject: public Subject
{
public:
RealSubject(){}
~RealSubject(){}
void Request() override
{
cout<<"真实的请求" <<endl;
}
};
class Proxy : public Subject
{
public:
Proxy():realSubject(nullptr){}
~Proxy()
{
delete realSubject;
}
void Request() override
{
if (realSubject == nullptr)
realSubject = new RealSubject();
realSubject->Request();
}
private:
RealSubject *realSubject;
};
int main()
{
Proxy *proxy = new Proxy();
proxy->Request();
delete proxy;
return 0;
}
Subject类,定义了RealSubject 和 Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。
(2)追求者代理事例使用代理模式实现
//代理模式应用
#include <iostream>
#include <string>
using namespace std;
//接口类
class IGiveGift
{
public:
IGiveGift(){}
virtual ~IGiveGift(){}
virtual void giveDolls()=0;
virtual void giveFlowers()=0;
virtual void giveChocolate()=0;
};
//被追求者类
class SchoolGirl
{
public:
SchoolGirl(){}
virtual ~SchoolGirl(){}
string getName()
{
return name;
}
void setName(string name)
{
this->name = name;
}
private:
string name;
};
//追求者类
class Pursuit: public IGiveGift
{
public:
Pursuit(){}
~Pursuit(){}
Pursuit(SchoolGirl *mm)
{
this->mm = mm;
}
void giveDolls()
{
cout << mm->getName() << " 送你洋娃娃" <<endl;
}
void giveFlowers()
{
cout << mm->getName() <<" 送你鲜花" <<endl;
}
void giveChocolate()
{
cout << mm->getName() <<" 送你巧克力" <<endl;
}
private:
SchoolGirl *mm;
};
//代理类
class Proxy : public IGiveGift
{
public:
Proxy(){}
~Proxy()
{
delete gg;
}
Proxy(SchoolGirl *mm)
{
gg = new Pursuit(mm);
}
void giveDolls()
{
gg->giveDolls();
}
void giveFlowers()
{
gg->giveFlowers();
}
void giveChocolate()
{
gg->giveChocolate();
}
private:
Pursuit *gg;
};
int main()
{
SchoolGirl *mengwei= new SchoolGirl();
mengwei->setName("武梦薇");
Proxy *liu = new Proxy (mengwei);
liu->giveDolls();
liu->giveFlowers();
liu->giveChocolate();
delete mengwei;
delete liu;
return 0;
}
代理模式应用
1.远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在与不同地址空间的事实。
2.虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
3.安全代理,用来控制真实对象访问时的权限。
4.只能指引,是指当调用真实的对象时,代理处理另外一些事。