代理模式:为其他对象提供一种代理以控制对这个对象的访问。代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。可以应用的场合:1、远程代理;2、虚拟代理;3安全代理;4、智能指引。(都没用过,不做介绍了)。
以追求MM为例,小A喜欢MM小C,但是小C不认识小A,但是认识小A的好哥们小B,于是小A就买了礼物让小B代理他送给小C,并转达他的爱意。此时小A就是RealSubject类,而小B就是Proxy类,他们共同继承Subject抽象接口类即礼物类,小A是真正的送礼物的,所以他必须实现这个抽象接口类。小B是代理者,他必须调用小A实现的方法。
#include <iostream>
#include <string>
using namespace std;
class SchoolGirl
{
private:
string name;
public:
SchoolGirl( string& na ) : name(na)
{}
string GetName()
{
return name;
}
void SetName(string& na)
{
name = na;
}
};
/* 代理接口 */
class IGiveGift
{
public:
virtual void GiveDolls() = 0;
virtual void GiveFlowers() = 0;
virtual void GiveChocolate() = 0;
};
/* 追求者 */
/* 让追求者去实现送礼物的接口 */
class Pursuit : public IGiveGift
{
private:
SchoolGirl mm;
public:
Pursuit( SchoolGirl& m ) : mm(m)
{}
virtual void GiveDolls()
{
cout<<mm.GetName()<<" 送你洋娃娃"<<endl;
}
virtual void GiveFlowers()
{
cout<<mm.GetName()<<" 送你鲜花"<<endl;
}
virtual void GiveChocolate()
{
cout<<mm.GetName()<<" 送你巧克力"<<endl;
}
};
/* 代理模式 */
class Proxy : public IGiveGift
{
private:
Pursuit* gg; /* 指向被代理对象的指针 */
public:
Proxy( SchoolGirl& mm )
{
gg = new Pursuit(mm);
}
~Proxy()
{
delete gg;
}
/* 在实现方法中调用追求者类的相关方法,因为真正送礼物的是追求者 */
virtual void GiveDolls()
{
gg->GiveDolls();
}
virtual void GiveFlowers()
{
gg->GiveFlowers();
}
virtual void GiveChocolate()
{
gg->GiveChocolate();
}
};
int main()
{
string name = "娇娇";
SchoolGirl sgirl(name);
Proxy daili( sgirl );
daili.GiveDolls();
daili.GiveFlowers();
daili.GiveChocolate();
return 0;
}