java软件体系结构设计模式----代理

一、代理模式的结构

代理模式给某一个对象提供一个代理对象,并有代理对象控制对原对象的引用。按照使用目的来划分有以下几种:

远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是在本机器中,也可是在另一台机器中。远程代理又叫做大使。

虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。

Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。

保护(Protect or Access)代理:控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。

Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。

防火墙(Firewall)代理:保护目标,不让恶意用户接近。

同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。

智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如:将对此对象调用的次数记录下来等。

其结构图如下:

二、代理模式在java中的应用

Java的动态代理

在java.lang.reflect库中提供下面三个类直接支持代理模式:Proxy,InvocationHandler,Method。可以按照下面步骤创建动态代理对象:

1、指明一系列的接口来创建一个代理对象。

2、创建一个调用处理器(Invocation Handler)对象。

3、将这个代理制定为某个其他对象的代理对象。

4、在调用处理器的invoke()方法中采取代理,一方面将调用传递给真实对象,另一方面执行各种需要做的操作。

例如:

  1. import java.awt.List;  
  2. import java.lang.reflect.InvocationHandler;  
  3. import java.lang.reflect.Method;  
  4. import java.lang.reflect.Proxy;  
  5. import java.util.Vector;  
  6. public class VectorProxy implements InvocationHandler{  
  7.    
  8.        private Object proxyobj;        
  9.        public VectorProxy(Object obj){  
  10.               proxyobj = obj;  
  11.        }  
  12.        public static Object factory(Object obj){  
  13.               Class cls = obj.getClass();  
  14.               return Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),new VectorProxy(obj));  
  15.        }  
  16.        public Object invoke(Object proxy,Method method,Object[]args)throws Throwable{  
  17.               System.out.println("before calling" + method);  
  18.               if(args!=null){  
  19.                      for(int i=0;i<args.length;i++)  
  20.                             System.out.println(args[i] + "");  
  21.               }  
  22.               Object o = method.invoke(proxyobj, args);  
  23.               System.out.println("after calling" + method);  
  24.               return 0;  
  25.        }  
  26.        public static void main(String []args){  
  27.               List v = null;  
  28.               v = (List)factory(new Vector(10));  
  29.               v.add("New");  
  30.               v.add("York");  
  31.        }      
  32. }  
 

三、代理模式与其他模式的关系

适配器模式

适配器模式与代理模式很相像,他们都可视为一个对象提供一种前置的接口。适配器模式的用意是要改变所考虑的对象接口,而代理模式并不能改变所代理的对象的接口。

装饰模式

装饰模式与所装饰的对象具有相同的接口,因此这两种模式也有可能混淆。但是,装饰模式应当为所装饰的对象提供增强功能;而代理模式对对象的使用施加控制,并不提供对象本身的增强功能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值