设计代理替代追求者向被追求者送玩偶、送花、送巧克力。 分析:追求者类和代理类都应该拥有送礼物的接口,只不过代理类送的礼物实际是追求者送的
被追求者Schoolgirl类只有name这一成员变量,两个成员函数是设置name和获取name。
class Schoolgirl { private: string name; public: string getName() { return name; } void setName(string str) { name = str; } };如前分析所述,追求者类和代理类都应该拥有送礼物的接口,现由一个抽象类定义接口。三个纯虚函数用来送玩偶送花、送巧克力,由子类来实现
//抽象类:定义代理类和真正对象类的公共接口 class Givegift { public: virtual void giveFlowers() = 0; virtual void giveChocolate() = 0; virtual void giveDolls() = 0; };追求者类实际买的礼物,所以需要继承送礼物类并实现它
class Pursuit : public Givegift { private: Schoolgirl* mm; public: Pursuit(Schoolgirl* m) { this->mm = m; } void giveFlowers() { cout << "给" << mm->getName()<<"Flowers" << endl; } void giveChocolate() { cout << "给" << mm->getName() << "Chocolate" << endl; } void giveDolls() { cout << "给" << mm->getName() << "Dolls" << endl; } };代理类也同样拥有送礼物的接口,但是实现方法却是调用追求者中相关方法。所以我们需要保存一个追求者的指针来代理相关的接口。
//代理类:保存指针来访问实体 class Proxy :public Givegift { public: Pursuit *gg; Proxy(Schoolgirl* mm) { gg = new Pursuit(mm); } void giveDolls() { gg->giveDolls(); } void giveFlowers() { gg->giveFlowers(); } void giveChocolate() { gg->giveChocolate(); } };在完成上述类的定义后,main函数需要构造被追求者、构造代理托管追求者实现要求功能
int main() { //定义被追求者娇娇 Schoolgirl *jiaojiao = new Schoolgirl(); jiaojiao->setName("娇娇"); //代理者daili,构造时也构造追求者 Proxy* daili = new Proxy(jiaojiao); //实际调用追求者定义的接口 daili->giveChocolate(); daili->giveDolls(); daili->giveFlowers(); return 0; }输出如下:
整个代理模式结构图如下 代理模式:为其他对象提供一种代理以控制对这个对象的访问。可以理解为访问对象引入了一定程度的间接性。 应用场景
远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
虚拟代理,是根据需要创建开销很大的对象。通过他来存放实例化需要很长时间的真实对象。例如:图片加载的时候。
安全代理,用来控制真是对象访问时的权限。
智能指引,是指当调用真实的对象的时候,代理处理另外一些事。
