//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的地方都可以使用Proxyclass 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();}
//代理模式场合:
//一.远程代理。也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。//二.虚拟代理。是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。//三.安全代理。用来控制真实对象访问时的权限。//四.智能指引。当调用真实的对象时,代理处理另外一些事。