代理模式,为其他对象提供一种代理以控制对这个对象的访问。
代理模式应用:
1、远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
2、虚拟代理,根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。
3、安全代理,用来控制真实对象访问时的权限。
4、智能指引,当调用真实对象时,代理处理另外一些事。
#include <iostream>
#include <string>
using namespace std;
class GiveGift //接口类 用于存放虚函数
{
public:
virtual void GiveDolls(){return;} //虚函数 送洋娃娃
virtual void GiveFlowers(){return;} //虚函数 送鲜花
virtual void GiveChocolate(){return;} //虚函数 送巧克力
};
class Girl //被追求者 接收礼物的女孩
{
string m_name; //女孩名字
public:
Girl(string name):m_name(name){}; //构造函数 传入女孩名字
string getname(){return m_name;} //获取女孩名字
};
class Pursult : public GiveGift //追求者类
{
Girl* m_mm; //女孩类指针
public:
Pursult(Girl* mm):m_mm(mm){}; //构造函数 传入被追求者 女孩
void GiveDolls() //虚函数的补全 送洋娃娃
{
cout<<m_mm->getname()<<" 送你洋娃娃"<<endl;
}
void GiveFlowers() //虚函数的补全 送鲜花
{
cout<<m_mm->getname()<<" 送你鲜花"<<endl;
}
void GiveChocolate() //虚函数的补全 送巧克力
{
cout<<m_mm->getname()<<" 送你巧克力"<<endl;
}
};
class Proxy : public GiveGift //代理类 负责替追求者向女孩送礼物
{
Pursult* gg; //追求者类指针
public:
Proxy(Girl* mm) //构造函数 通过传入的女孩名字实例化追求者
{
gg = new Pursult(mm);
}
void GiveDolls() //代理者送洋娃娃
{
gg->GiveDolls();
}
void GiveFlowers() //代理者送鲜花
{
gg->GiveFlowers();
}
void GiveChocolate() //代理者送巧克力
{
gg->GiveChocolate();
}
};
int main()
{
Girl* mm = new Girl("小雪"); //实例化女孩
Proxy* daili = new Proxy(mm); //实例化代理
daili->GiveDolls(); //代理者送洋娃娃
daili->GiveFlowers(); //代理者送鲜花
daili->GiveChocolate(); //代理者送巧克力
return 0;
}
通过代理类,主函数中只需知道女孩类和代理类,而不需要知道追求者。