标签:设计模式 代理模式 动态代理 静态代理 java代理实现
1、代理模式(Proxy pattern)的介绍 :
a、核心作用:
- 通过代理,控制对对象的访问!
* 可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,在调用这个方法后做后置处理。(即:AOP (面向切面编程)的微观实现)
b、核心角色:
- 抽象角色: 定义代理角色和真实角色的公共对外方法
- 真实角色: 实现抽象角色,定义真实角色所要实现的业务逻辑,共代理角色调用。(即关注真正的业务逻辑)
- 代理角色: 实现抽象角色,是真正角色的代理,通过真正角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。(即将统一的流程控制放到代理角色中处理)
2、代理模式的分类:
- 静态代理(静态定义代理类)
- 动态代理(动态生成代理类,常用)
* JDK 自带的动态代理:
- java.lang.reflect.Proxy : 作用是动态生成代理类和对象
- java.lang.refect.InvocationHandler(处理器接口)
* 可以通过 invoke 方法实现对真正角色的代理访问。
* 每次通过 Proxy 生成的代理类对象是都要指定对应的处理器对象。
* javaassist 字节码操作库实现
* CGLIB
3、静态代理的简单代码示例:
a、创建 Star 接口和其实现类 ProxyStar、RealStar,以及测试类 Client07。
注:我们可以看到,Star 接口可以看作是抽象角色,而 ProxyStar 类是代理角色,RealStar 类是真实角色。(代理角色与真实角色之间的关系是组合关系)
b、以上静态代理的代码示例的类图。
注:可以看到,客户端调用者 Client07 只是和 Star 接口打交道。
4、动态代理的简单示例代码:
a、和静态代理一样,需要抽象角色和真实角色。
b、创建一个实现了 InvocationHandler 接口(处理器接口)的实现类 StarHandler,并且重写invoke 方法。在 Client08 调用测试类中,使用 Proxy.newProxyInstance() 方法创建一个 对 realStar 对象的代理对象, 并且详细控制该对象的访问方法。(看看输出结果,可以在真实角色的业务方法调用前或者调用后做一系列的操作流程。)
5、应用场景:
- 安全代理:屏蔽对真实角色的直接访问。
- 远程代理:通过代理类处理远程方法调用(RMI)
- 延迟代理:先加载轻量级的代理对象,真正需要再加载真正对象。
本文出自 “12392717” 博客,请务必保留此出处http://12402717.blog.51cto.com/12392717/1928406
标签:设计模式 代理模式 动态代理 静态代理 java代理实现
原文地址:http://12402717.blog.51cto.com/12392717/1928406