//4.代理模式 //ver1 //被追求者类 class SchoolGirl { private: string _name; public: SchoolGirl(){} SchoolGirl(string name) { _name = name; } string GetName() { return _name; } void SetName(string name) { _name = name; } }; //接口函数类 class GiveGift { public: GiveGift(){} //Interface virtual void GiveToy() { //... } virtual void GiveFlower() { //... } }; //追求者类 class Pursuit : public GiveGift { private: SchoolGirl _mm; public: Pursuit(SchoolGirl mm) { _mm = mm; } void GiveToy() { _mm.GetName(); // + 送你玩具 } void GiveFlower() { _mm.GetName(); // + 送你花 } }; //代理类 //代理也去实现 "送礼物" 的接口 class Proxy : public GiveGift { private: Pursuit *pps; public: Proxy(SchoolGirl mm) { pps = new Pursuit(mm); } void GiveFlower() { pps->GiveFlower(); //在实现方法中去调用"追求者"类的相关方法; } void GiveToy() { pps->GiveToy(); } }; void main1() { SchoolGirl mm("ysl"); Proxy *pp1 = new Proxy(mm); pp1->GiveFlower(); //SchoolGirl不认识Pursuit,但可以通过Proxy得到礼物。 pp1->GiveToy(); } //代理模式: 为其他对象提供一种代理以控制对这个对象的访问.
//4.代理模式 //ver2 //Subject: 定义了 RealSubject 和 Proxy 的共用接口。这样在任何使用 RealSubject的地方都可以使用Proxy class Subject { public: virtual void Request() = 0; }; //RealSubject: 定义Proxy所代表的真实实体。 class RealSubject : public Subject { public: virtual void Request() { //真实请求 } }; //Proxy: 保存一个引用使得代理可以访问实体。 class Proxy : public Subject { private: RealSubject *rs; public: virtual void Request() { if (rs == NULL) { rs = new RealSubject(); } rs->Request(); } }; void main2() { Proxy *pp1 = new Proxy(); pp1->Request(); }
//代理模式场合:
//一.远程代理。也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
//二.虚拟代理。是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。
//三.安全代理。用来控制真实对象访问时的权限。
//四.智能指引。当调用真实的对象时,代理处理另外一些事。