代理(Proxy)模式给某一个对象提供一个代理或占位符,以控制对这个对象的访问。Proxy模式代理和实际执行者派生于共同的接口,代理拥有实际执行者的实例,代理的每一个函数(接口的实现函数),直接调用实际执行者的对应接口函数。有时我们不能直接引用另一个对象,或者是需要使用的对象很复杂或者需要很长时间去构造,这时就可以使用代理模式(Proxy)。
以下是我联想实际生活并结合对Proxy的理解,想到的使用代理模式(Proxy)的两种应用情景:
1、控制对象访问:一个对象只有有限的访问权限,代理模式(Proxy)可以验证用户的权限。
例:我们在网购时知道订单一旦被创建,只有订单创建者才可以修改订单中的数据,其他人则无权修改。下面是通过Proxy设计模式控制对象的访问的类图。
实现如下:
1 class Order_AbstractClass 2 { 3 public: 4 string getProductName(); 5 void setProductName(string productName,string consumer); 6 int getOrderID(); 7 void setOrderID(int orderID, string consumer); 8 string getOrderCreater (); 9 void setOrderCreater (string orderCreater, string consumer); 10 } 11 class Order: Order_AbstractClass { 12 private: 13 string productName; 14 int orderID; 15 string orderCreater; 16 public : 17 Order(string productName,int orderID,string orderCreater) 18 { 19 productName=productName; 20 orderID = orderID; 21 orderCreater = orderCreater; 22 } 23 int getOrderID () { 24 return orderID; 25 } 26 string getOrderCreater() { 27 return orderCreater; 28 } 29 string getProductName() { 30 return productName; 31 } 32 void setOrderID(int orderID, string consumer) 33 { 34 OrderID = orderID; 35 } 36 void setOrderCreater (string orderCreater, string consumer) { 37 orderCreater=orderCreater; 38 } 39 void setProductName(string productName, string consumer) { 40 productName=productName; 41 } 42 } 43 class OrderProxy: Order_AbstractClass { 44 private: 45 Order order; 46 public: 47 OrderProxy(Order realorder) { 48 order=realorder; 49 } 50 int getOrderID() { 51 return order.getOrderID (); 52 } 53 string getOrderCreater() { 54 return order.getOrderCreater (); 55 } 56 string getProductName() { 57 return order.getProductName(); 58 } 59 void setOrderID(int orderID, string consumer) { 60 if(consumer!=NULL && consumer.equals(this.getOrderCreater())){ 61 order.setOrderID(orderID, consumer); 62 cout<<"恭喜您修改成功"<<endl; 63 }else{ 64 cout<<"您无权修改订单号"<<endl; 65 }} 66 void setOrderCreater(string orderCreater, string consumer) { 67 if(consumer!=null && consumer.equals(this.getOrderCreater ())){ 68 order.setOrderCreater(orderCreater, consumer); 69 cout<<"恭喜您修改成功"<<endl; 70 }else{ 71 cout<<"您无权修改订单创建者"<<endl; 72 }} 73 void setProductName(string productName, string consumer) { 74 if(consumer!=null && consumer.equals(this.getOrderCreater ())){ 75 order.setProductName(productName, consumer); 76 cout<<"恭喜您修改成功"<<endl; 77 }else{ 78 cout<<"您无权修改产品名称"<<endl; 79 }} 80 void main(){ 81 Order_AbstractClass order=new OrderProxy(new Order("C++设计模式",2,"小四")); 82 order.setOrderID(123, "小五"); 83 order.setOrderID(123, "小四"); 84 order.setProductName("C++编程", "小四"); 85 order.setOrderCreater("小七", "小六"); 86 }
2、作为远程代理使用外域的对象:有些情况下,一个客户不想或者不能够直接引用一个对象,使用Proxy代理模式的代理对象可以在客户端和目标对象之间起到中介的作用。
例:代理服务器的功能就是代理网络用户去取得网络信息。在一般情况下,我们使用网络浏览器直接去连接其他Internet站点取得网络信息时,须送出Request信号来得到回答,然后对方再把信息以bit方式传送回来。代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你的浏览器。如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,否则,通过从Web服务器获取所需信息,这样能显著提高浏览速度和效率。如下图所示: