设计模式——之代理模式(proxy)

A 抽象类(interaface):声明真实对象和代理对象的共同接口。
B 真实类(real class)  :代表程序真正要引用的对象
C 代理类(proxy class) : 代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,
   同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。
   同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。


结构:B继承A,C继承A,C代理B。
作用:对外部提供统一的接口方法,而代理类在接口中实现对真实类的附加操作行为,从而可在不影响外部调用情况下进行系统扩展。
也就是说,我要修改真实角色的操作的时候,尽量不要修改他,而是在外部在“包”一层进行附加行为,即代理类。


当我们需要使用的对象很复杂或者需要很长时间去构造,这时就可以使用代理模式(Proxy)。例如:如果构建一个对象很耗费时间和计算机资源,代理模式(Proxy)允许我们控制这种情况,直到我们需要使用实际的对象。一个代理(Proxy)通常包含和将要使用的对象同样的方法,一旦开始使用这个对象,这些方法将通过代理(Proxy)传递给实际的对象。 一些可以使用代理模式(Proxy)的情况:



  一个对象,比如一幅很大的图像,需要载入的时间很长。    
  一个需要很长时间才可以完成的计算结果,并且需要在它计算过程中显示中间结果
  一个存在于远程计算机上的对象,需要通过网络载入这个远程对象则需要很长时间,特别是在网络传输高峰期。
  一个对象只有有限的访问权限,代理模式(Proxy)可以验证用户的权限
  代理模式(Proxy)也可以被用来区别一个对象实例的请求和实际的访问,例如:在程序初始化过程中可能建立多个对象,但并不都是马上使用,代理模式(Proxy)可以载入需要的真正的对象。这是一个需要载入和显示一幅很大的图像的程序,当程序启动时,就必须确定要显示的图像,但是实际的图像只能在完全载入后才可以显示!这时我们就可以使用代理模式(Proxy)。

#include<iostream>
#include<string>
using namespace std;

// abstract class(interface)
class SaleIntertace{
public:
	virtual void sell() = 0;
};

// 生产类(实际类)
class Produce : public SaleIntertace{
private:
	string product;
public:
	Produce(string product):product(product){
	}
	void sell(){
		cout << product <<endl;
	}
};

// 售卖类(代理类)
class SaleProxy : public SaleIntertace{
private:
	Produce *pd;
public:
	SaleProxy(string product){
		pd = new Produce(product);
	}
	void sell(){
		pd->sell();
	}
};

int main(){
	SaleProxy sp("tea");
	sp.sell();
	return 0;
}


使用:
在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用 Proxy模式。下面是一些可以使用Proxy模式常见情况:
1) 远程代理(Remote  Proxy)为一个位于不同的地址空间的对象提供一个本地的代理对象。
这个不同的地址空间可以是在同一台主机中,也可是在另一台主机中,远程代理又叫做大使(Ambassador)
2) 虚拟代理(Virtual Proxy)根据需要创建开销很大的对象。如果需要创建一个资源消耗较大的对象,
先创建一个消耗相对较小的对象来表示,真实对象只在需要时才会被真正创建。 
3) 保护代理(Protection Proxy)控制对原始对象的访问。保护代理用于对象应该有不同的访问权限的时候。
4) 智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。
5) Copy-on-Write代理:它是虚拟代理的一种,把复制(克隆)操作延迟到只有在客户端真正需要时才执行。
一般来说,对象的深克隆是一个开销较大的操作,Copy-on-Write代理可以让这个操作延迟,只有对象被用到的时候才被克隆。


//  可参考: http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/04/2576865.html
//  也可参考:http://blog.csdn.net/hguisu/article/details/7542143




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值