1、文档编号:xxxx代理模式文档编号:xxxxI目录1 代理模式 11.1 代理模式 .11.2 代理模式的使用场景 11.3 代理模式的分类 .11.4 代理模式的本质 .22 静态代理 22.1 静态代理的实现 .23 动态代理 43.1 动态代理的实现 .4文档编号:xxxx11 代理模式1.1代理模式代理模式是常用的 java 设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后 处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类
2、的 对象的相关方法,来提供特定的服务。1.2代理模式的使用场景代理模式使用场景非常多,如面向切面编程(Spring 中的 AOP) ,虚代理模式(hibernate中的懒加载) ,保护代理(权限服务控制) ,远程代理(Java 中的 RMI 技术)等。1.3代理模式的分类按照代理的创建时期,代理类可以分为两种。 (1 )静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class 文件就已经存在了。 (2 )动态代理:在程序运行时,运用反射机制动态创建而成。按照代理用途来分类:(1 ) 虚代理:根据需求来创建开销很大的对象,该对象只有在需要的时候才会被真正的被
3、创建。(2 ) 远程代理:用来在不同的地址空间上代表同一对象,这个不同的地址空间可以使在本机也可以是在其他机器上。在 Java 里面最典型的就是 RMI 技术。(3 ) Copy-on-write 代理:在客户端操作的时候,只有对象确实改变了才会真的拷贝一个目标对象,算是虚代理的一个分支。(4 ) 保护代理:控制原始对象的访问,如果有需要,可以给不同的用户提供不同的访问权限,以控制他们对原始对象的访问。(5 ) Cache 代理:为那些昂贵操作的结构提供临时的存储空间,以便多个客户端可以共享这些结果。(6 ) 智能代理:在访问对象时执行一些附加操作,比如,对指向实际对象的引用计数,第一次引用一
4、个持久对象时,将它装入内存等。(7 ) 防火墙代理:保护对象不被恶意程序访问和操作。(8 ) 同步代理:使多个用户能够同时访问目标对象而不发生冲突。文档编号:xxxx21.4代理模式的本质代理模式的本质:控制对象的访问。2 静态代理2.1静态代理的实现(1 ) ,代理接口package com.proxy;/* 代理接口* author xmong*/public interface TestProxy /* 代理接口方法*/public void doSomething();(2 ) ,代理实现package com.proxy;/* 代理实现类-被代理的对象* author xmong*/
5、public class TestProxyImpl implements TestProxy/* 代理实现方法*/public void doSomething() System.out.println(“test proxy do something.“);文档编号:xxxx3(3 ) ,静态代理package com.proxy;/* 静态代理实现-静态代理对象* author xmong*/public class TestStaticProxy implements TestProxy/代理接口TestProxy testProxy;/* 构造静态代理,初始化被代理对象*/publi
6、c TestStaticProxy()this.testProxy = new TestProxyImpl();/* 构造静态代理,初始化可接收被代理对象* param testProxy*/public TestStaticProxy(TestProxy testProxy)this.testProxy = testProxy;/* 代理方法*/public void doSomething() System.out.println(“static proxy do something.“);this.testProxy.doSomething();文档编号:xxxx4(4 ) ,测试静态代
7、理package com.proxy;/* 测试代理* author xmong*/public class Test /* 测试静态代理方法* 输出结果* static proxy do something.* test proxy do something.*/public void testStaticProxy()TestStaticProxy sp = new TestStaticProxy();sp.doSomething();/* main 方法* param args*/public static void main(String args) Test t = new Test
8、();t.testStaticProxy();3 动态代理3.1动态代理的实现同理静态代理,创建好代理接口和代理实现。(1 ) ,动态代理package com.proxy;文档编号:xxxx5import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/* 动态代理实现-动态代理对象* author xmong*/public class TestDynamicProxyHandler implements InvocationHandler
9、 /* 被代理目标对象*/private Object targetObject;/* 创建被代理对象* param targetOjbect* return*/public Object createProxy(Object targetOjbect)this.targetObject = targetOjbect;return Proxy.newProxyInstance(targetOjbect.getClass().getClassLoader(),targetOjbect.getClass().getInterfaces(), this);/* 动态代理方法*/Overridepub
10、lic Object invoke(Object proxy, Method method, Object args)throws Throwable Object result = null;System.out.println(“dynamic proxy do something.“);result = method.invoke(this.targetObject, args);return result;(2 ) ,测试动态代理package com.proxy;文档编号:xxxx6/* 测试代理* author xmong*/public class Test /* 测试静态代理方
11、法* 输出结果* static proxy do something.* test proxy do something.*/public void testStaticProxy()TestStaticProxy sp = new TestStaticProxy();sp.doSomething();/* 测试动态代理方法* 输出结果* dynamic proxy do something.* test proxy do something.*/public void testDynamicProxy()TestDynamicProxyHandler dp = new TestDynamicProxyHandler();TestProxy tp = (TestProxy)dp.createProxy(new TestProxyImpl();tp.doSomething();/* main 方法* param args*/public static void main(String args) Test t = new Test();/t.testStaticProxy();t.testDynamicProxy();