首页 > 代码库 > 代理模式之基础
代理模式之基础
“代理”这个熟悉而又陌生的词语,熟悉是因为在生活中随处可见:超市就是一个简单的代理;让别人代送礼物是一个代理;让别人传递一个消息也是一个代理、、、看吧在生活这么多代理,但是这个组成的代理模式到底是什么呢?它又有什么用途呢?没有它会怎么样?等等一些列的问题围绕着我,那么接下来就一块学习下代理模式吧!
一、是什么?
代理模式(proxy)很官方的说法,为其他对象提供一种代理以控制对这个对象的访问。说白了就是为这个对象解耦,由原来的直接访问到间接访问,这样将其分离达到解耦的目的。UML图:
二、分类
代理模式可以分为静态代理和动态代理。
静态代理是为每个被代理的对象构造对应的代理类,但是如果为多个类进行代理,并且前后插入的代码都是一致的,那么就会产生很多重复的代码,就是为了解决这个问题引入了动态代理。
动态代理是在运行时动态创建的具体委托类。动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。
三、什么时候用?
1.创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GOF称之为虚代理(Virtual Proxy)
2.为网络上的对象创建一个局部的本地代理,比如要操作一个网络上的一个对象(网络性能不好的时候,问题尤其突出),我们将这个操纵的过程交给一个代理去完成,GOF称之为远程代理(Remote Proxy)
3.对对象进行控制访问的时候,比如在Jive论坛中不同权限的用户(如管理员、普通用户等)将获得不同层次的操作权限,我们将这个工作交给一个代理去完成,GoF称之为保护代理(ProtectionProxy)
4.智能指针(Smart Pointer),关于这个方面的内容,建议参看Andrew Koenig的《C++沉思录》中的第5章
四、优缺点
优点:协调调用者和被调用者,一定程度上降低耦合
缺点:有些类型的代理模式会造成请求处理速度变慢需增加额外工作,比如实现很多重复的代码。有些代理模式实现复杂。
五、总结
通过以上对代理模式的简单理解,用简单的一句话来概括就是:为被代理者提供一个中间层类来为它和直接调用被代理者类解耦。关于静态代理和动态代理怎么用就期待下一篇吧!
代理模式之基础