一、什么是Java代理模式(Proxy Pattern)?
(1)定义:
给目标对象提供一个代理对象,并且由代理对象控制对目标对象的引用
目标对象不对用户提供引用,用户只能看到当前代理对象
(回顾:对象的产生:在堆中开辟一块内存空间,类是构建对象的模板)
(2)目的:
1.功能增强:通过代理业务对原有业务进行增强
2.控制访问:通过代理对象的方式间接访问目标对象,防止直接访问目标对象给系统带来不必要的复杂性
二、相关概念:
目标类:原对象,我们需要代理对象控制它的访问,拓展其功能
代理类:代理模式产生的对象,时原对象的“替身”,已经在原有基础上修改逻辑
三、代理类如何控制目标类引用?
创建对象

代理类


四、静态代理:
(1)含义:
静态代理是在编译时就已经确定代理类和被代理类的关系
简单来说代理模式就是将被代理类包装起来然后重新实现相同的方法,并且调用原来方法的同时可以在方法前后添加一个新的处理。而这种包装可以使用**继承**或者**组合**来使用。当我们调用的时候需要使用的是代理类的对象来调用而不是原来的被代理对象。
(2)实现方式:
1.通过继承实现 2.通过组合实现
(3)实现步骤:
1.定义抽象主题接口
2.创建真实主题类实现接口
3.创建代理类也实现相同接口
4.在代理类中调用真实主题的方法
(4)代码示例:

(5)优缺点:
1.优点:
结构清晰,易于理解和实现
在不修改目标对象功能的前提下,能通过代理对象对目标功能扩展
2.缺点:
代理类和目标类必须实现相同的接口,导致类数量增加
接口增加方法时,目标类和代理类都需要维护
五、动态代理:
(1)含义:
动态代理是在运行时动态生成代理类,不需要为每个目标类都编写一个代理类
动态代理其实本质还是 将被代理类包装一层,生成一个具有新的相同功能的代理类。
但是与静态代理不同的是,这个代理类我们自己定义的。而动态代理这个代理类是根据我们的提示动态生成的。
(2)实现方式:jdk cglib
六、JDK动态代理:
通过Java提供的Proxy类帮我们创建代理对象
JDK动态代理基于接口实现,使用java.lang.reflect.Proxy类和InvocationHandler接口
(1)代码示例:


(2)特点:
1.只能代理实现了接口的类
2‘生成的代理类继承Proxy类
3’使用反射机制调用方法,性能有一定开销
六、代理模式的比较与选择:

选择建议:
如果目标对象实现了接口,优先使用JDK动态代理
如果代理逻辑简单且固定,可以考虑静态代理
1067

被折叠的 条评论
为什么被折叠?



