概念

  • 代理模式(Proxy Pattern) ,给某一个对象提供一个代理,并由代理对象控制对原对象的引用,对象结构型模式。这种也是静态代理
  • image.png

主要角色

  • Subject: 抽象主体角色(抽象类或接口)
  • Proxy: 代理主体角色(代理对象类)
  • RealSubject: 真实主体角色(被代理对象类)

静态代理

  • 可以说就是装饰器模式

动态代理

  1. /**
  2. * Subject: 抽象主体角色(抽象类或接口)
  3. */
  4. public interface ManTikTok {
  5. void tiktok();
  6. }
  1. /**
  2. * RealSubject: 真实主体角色(被代理对象类)
  3. */
  4. public class LeiTikTok implements ManTikTok,SellTikTok {
  5. // @Override
  6. public void tiktok() {
  7. System.out.println("雷丰阳,tiktok.... ");
  8. }
  9. @Override
  10. public void sell() {
  11. System.out.println("雷丰阳,只要666,赶紧来包...");
  12. }
  13. public void haha(){
  14. System.out.println("hahaha ,......");
  15. }
  16. }
  1. /**
  2. * Proxy: 代理主体角色
  3. * @param <T>
  4. */
  5. public class JdkTiktokProxy<T> implements InvocationHandler {
  6. private T target;
  7. //接受被代理对象
  8. JdkTiktokProxy(T target){
  9. this.target = target;
  10. }
  11. /**
  12. * 获取被代理对象的 代理对象
  13. * @param t
  14. * @param <T>
  15. * @return
  16. */
  17. public static<T> T getProxy(T t) {
  18. /**
  19. * ClassLoader loader, 当前被代理对象的类加载器
  20. * Class<?>[] interfaces, 当前被代理对象所实现的所有接口
  21. * InvocationHandler h,
  22. * 当前被代理对象执行目标方法的时候我们使用h可以定义拦截增强方法
  23. */
  24. Object o = Proxy.newProxyInstance(
  25. t.getClass().getClassLoader(),
  26. t.getClass().getInterfaces(), //必须接口
  27. new JdkTiktokProxy(t));
  28. return (T)o;
  29. }
  30. /**
  31. * 定义目标方法的拦截逻辑;每个方法都会进来的
  32. *
  33. * @param proxy
  34. * @param method
  35. * @param args
  36. * @return
  37. * @throws Throwable
  38. */
  39. @Override
  40. public Object invoke(Object proxy,
  41. Method method,
  42. Object[] args) throws Throwable {
  43. //反射执行
  44. System.out.println("真正执行被代理对象的方法");
  45. Object invoke = method.invoke(target, args);
  46. System.out.println("返回值:一堆美女");
  47. return invoke;
  48. }
  49. }

应用场景

  • MyBatis的mapper到底是什么?怎么生成的?
  • Alibaba Seata的DataSourceProxy是什么?

  • DruidDataSource存在的Proxy模式