Java设计模式——代理模式 (3)

这里我们知道了这个反编译生成的java类实现了ITarget接口

/** * @description: JDK代理实现测试 * @author: lmc * @create: 2019-06-12 19:49 **/ public class JdkProxyTest { public static void main(String[] args) { ITarget target1 = (ITarget) new JdkProxy().getProxyInstance(new TargetImpl1()); target1.behavior(); ITarget target2 = (ITarget) new JdkProxy().getProxyInstance(new TargetImpl2()); target2.behavior(); ITarget target3 = (ITarget) new JdkProxy().getProxyInstance(new TargetImpl3()); target3.behavior(); /** * Target 类没有实现接口 无法被jdkproxy代理 */ ITarget target4 = (ITarget) new JdkProxy1().getProxyInstance(new Target()); target4.behavior(); } } JDK-proxy动态代理测试结果

Java设计模式——代理模式

嘿嘿,可以看到target4代理出错啦。原因就是Target类没有实现ITarget接口。

CGLib动态代理 /** * @description: CGLib动态代理对象 * @author: lmc * @create: 2019-06-12 17:00 **/ public class CGLibProxy implements MethodInterceptor { /** * @description: 被代理之前的增强行为 * @date 2019/6/12 15:56 * @author lmc */ private void beforeBehavior(){ System.out.println("执行代理之前需要做的一些事情。"); } /** * @description: 被代理之后的增强行为 * @date 2019/6/12 15:57 * @author lmc */ private void afterBehavior(){ System.out.println("执行代理之后需要做的一些事情。"); } /** * @description: 获取代理之后的实例对象 * @param target 被代理对象 * @return com.lmc.gp12380.pattern.proxy.ITarget * @date 2019/6/12 19:55 * @author lmc */ public Object getProxyInstance(Object target){ Class<?> clazz = target.getClass(); //相当于Proxy,代理的工具类 Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(clazz); enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { beforeBehavior(); /** * 利用 cglib 的代理类可以将内存中的 class 文件写入本地磁盘 */ System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "E://cglib_proxy_class/"); Object obj = methodProxy.invokeSuper(o,objects); afterBehavior(); return obj; } } /** * @description: CGLib代理实现测试 * @author: lmc * @create: 2019-06-12 20:26 **/ public class CGLibProxyTest { public static void main(String[] args) { ITarget target1= (ITarget) new CGLibProxy().getProxyInstance(new TargetImpl1()); target1.behavior(); ITarget target2= (ITarget) new CGLibProxy().getProxyInstance(new TargetImpl2()); target2.behavior(); ITarget target3= (ITarget) new CGLibProxy().getProxyInstance(new TargetImpl3()); target3.behavior(); Target target4= (Target) new CGLibProxy().getProxyInstance(new Target()); target4.behavior(); } } CGLib动态代理测试结果

Java设计模式——代理模式

嘿嘿,可以看到Target没有实现ITarget接口,也能实现动态代理。

代码里面是可以生成CGLib动态代理的字节码文件的,也可以反编译过来看看,因为我是看不懂,我就不展示了。

代理模式的优缺点 优点

代理模式能将代理对象与真实被调用的目标对象分离。

一定程度上降低了系统的耦合度,扩展性好。

可以起到保护目标对象的作用。

可以对目标对象的功能增强。

缺点

代理模式会造成系统设计中类的数量增加。

在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。

增加了系统的复杂度。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxjjs.html