今天看了代理模式,一开始还在想代码怎么能代理,看完之后,让我不得不佩服语言的丰富与奇妙,又学到了新的知识。代理模式的定义即为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的模式结构为:一个是真正的你要访问的对象(目标类),一个是代理对象,真正对象与代理对象实现同一个接口,先访问代理类再访问真正要访问的对象。代理模式分为静态代理、动态代理。静态代理是由编程者本人创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。动态代理是在实现阶段不用关心代理类,而在运行阶段才指定哪一个对象。
举个通俗易懂的例子吧。某班的女同学M收到了同班同学X的鲜花,X对M说这是他替自己的好朋友Y送给你的,所以在这里不难看出来,X就是Y的代理去给M送东西。X是代理类,Y是委托类。因此可以写成如下代码:
#include <iostream>
#include <string>
using namespace std ;
class Gifts
{
virtual void GiveFlowers(){} ;
virtual void GiveSweets(){} ;
virtual void GiveLetters(){} ;
};
class Lover //喜欢的对象
{
string strname ;
public:
Lover(string strname)
{
this->strname = strname ;
}
string Getname()
{
return strname ;
}
};
class Pursuer : public Gifts //委托者类
{
Lover * myLover ;
public:
Pursuer(Lover * myLover) //获取实例对象
{
this->myLover = myLover ;
}
void GiveFlowers()
{
cout<<myLover->Getname()<<" 送你的玫瑰花 " ;
}
void GiveSweets()
{
cout<<myLover->Getname()<<"送你的甜品 " ;
}
void GiveLetters()
{
cout<<myLover->Getname()<<"送你的信 " ;
}
};
class Proxy : public Gifts //代理类
{
Pursuer * myPursuer ;
public:
Proxy(Lover * myLover)
{
myPursuer = new Pursuer(myLover) ;
}
void GiveFlowers() //代理委托者送礼物
{
myPursuer->GiveFlowers() ;
}
void GiveSweets()
{
myPursuer->GiveSweets() ;
}
void GiveLetters()
{
myPursuer->GiveLetters() ;
}
};
int main()
{
Lover * myLover = new Lover("小欣") ;
Proxy * myProxy = new Proxy(myLover) ;
myProxy->GiveFlowers() ;
myProxy->GiveLetters() ;
myProxy->GiveSweets() ;
return 0 ;
}
对于代理模式,可能会觉得自己不会碰到当然也就不会用到了,其实不然,在很多地方都是要用到代理模式的: (1)远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
(2)虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象 。这样就可以达到性能的最优化,比如说你打开一个很大的HTML网页时,里面可能有很多的文字和图片,但你还是可以很快打开它,此时你所看到的是所有的文字,但是图片却是一张一张地下载后才能看到,那些未打开的图片框,就是通过虚拟代理来替代了真实的图片,此时代理存储了真实图片的路径和尺寸。
(3)安全代理,用来控制真实对象访问时的权限。
(4)智能指引,是指当调用真实的对象时,代理处理另外一些事。
代理模式的优点:
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2) 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
(3) 高扩展性
168万+

被折叠的 条评论
为什么被折叠?



