简介
代理模式:
为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
常用的场景
1.虚拟(Virtual)代理:
根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。
为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使(Ambassador)。好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的而不是远程的,而代理对象承担了大部份的网络通讯工作。由于客户可能没有意识到会启动一个耗费时间的远程调用,因此客户没有必要的思想准备。
当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。
控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。保护代理的好处是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。
为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。
保护目标,不让恶意用户接近。
使几个用户能够同时使用一个对象而没有冲突。
在所有种类的代理模式中,虚拟(Virtual)代理、远程(Remote)代理、智能引用代理(SmartReference Proxy)和保护(Protector Access)代理是最为常见的代理模式。
优点
1职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
2代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
3高扩展性
缺点
测试代码
#include <iostream>
using namespace std;
//对象类
class FBookItem
{
public:
FBookItem();
~FBookItem();
public:
//代理接口
void read();
void fire();
void clean();
};
//代理类
class FBookDetachItem
{
public:
FBookDetachItem();
~FBookDetachItem();
FBookItem m_oItem;
public:
void read(){m_oItem.read();};
void fire(){m_oItem.fire();};
void clean(){m_oItem.clean();};
};
void main()
{
system("PAUSE");
}