您的位置:首页 > 其它

设计模式(4)--代理模式

2016-11-02 22:04 190 查看
//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();
}


  

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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: