一、背景介绍
最近在做产品过程中对于日志的统一收集做了深入的研究,最终映射到代理模式的运用上了,通过对代理模式的再探,对代理模式的敬畏又进行了一层升华。
二、思路&方案
- 1.代理模式简介
- 2.代理模式的类图
- 3.代理模式代码
- 4.代理模式还可以优化的地方
- 5.代理模式的项目实战,优化后
三、过程
1.代理模式简介
代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问
2.代理模式的类图
3.代理模式代码
package com.a7DesignPattern.a2StructuralType.a07Proxy; /** * 功能描述: * * @Author:makang * @Date: 2021/5/22 10:02 */ public abstract class Subject { public abstract void Request(); }
package com.a7DesignPattern.a2StructuralType.a07Proxy; /** * 功能描述: * * @Author:makang * @Date: 2021/5/22 10:03 */ public class RealSubject extends Subject{ @Override public void Request() { System.out.println("真实对象"); } }
package com.a7DesignPattern.a2StructuralType.a07Proxy; /** * 功能描述: * * @Author:makang * @Date: 2021/5/22 10:04 */ public class Proxy extends Subject{ private RealSubject realSubject; @Override public void Request() { if(realSubject == null){ realSubject = new RealSubject(); } realSubject.Request(); } }
package com.a7DesignPattern.a2StructuralType.a07Proxy; /** * 功能描述: * * @Author:makang * @Date: 2021/5/22 10:06 */ public class Client { public static void main(String[] args) { Subject subject = new Proxy(); subject.Request(); } }
4.代理模式还可以优化的地方
- 1.通过代理类中使用泛型,将被代理对象延迟到运行时定义。
- 2.通过自定义注解或者包扫描的方式,将使用端进行一步优化
5.代理模式的项目实战,优化后(只加了泛型方式,使用CGLIB的代理)
package com.b0032AOP例子_CGLIB动态代理.V1基础例子; public class Calimpl{ public int add(int num1, int num2) { return num1 + num2; } public int sub(int num1, int num2) { return num1 - num2; } public int mul(int num1, int num2) { return num1 * num2; } public int div(int num1, int num2) { return num1 / num2; } }
package com.b0032AOP例子_CGLIB动态代理.V1基础例子; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; import java.lang.reflect.Method; import java.util.Arrays; public class MyMethodInterceptor<T> implements MethodInterceptor { public T getBind(Class<?> object){ Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(object); enhancer.setCallback(new MyMethodInterceptor()); return (T)enhancer.create(); } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println(method.getName() + "方法的参数是"+ Arrays.toString(objects)); Object result = methodProxy.invokeSuper(o,objects); System.out.println(method.getName()+"方法的结果是"+result); return result; } }
package com.b0032AOP例子_CGLIB动态代理.V1基础例子; public class Client { public static void main(String[] args) { MyMethodInterceptor<Calimpl> myMethodInterceptor = new MyMethodInterceptor(); Calimpl calimplProxy = myMethodInterceptor.getBind(Calimpl.class); calimplProxy.add(1,1); calimplProxy.sub(2,2); calimplProxy.mul(3,3); calimplProxy.div(4,4); } }
四、总结
- 1.代理模式的思想,通过将行为的抽象在运行时进行动态干预使得复用性、灵活性都做到了极大的提高
- 2.将单纯的代理模式通过和泛型的结合,使得灵活性再次提升
- 3.后续还可以通过自定义注解,或者包扫描的方式;进一步优化使用端
五、升华
当你的认知提升一个等级之后,再回头看经历过的知识,将会获得不一样的认识