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

主要角色
- Subject: 抽象主体角色(抽象类或接口)
- Proxy: 代理主体角色(代理对象类)
- RealSubject: 真实主体角色(被代理对象类)
静态代理
- 可以说就是装饰器模式
动态代理
/*** Subject: 抽象主体角色(抽象类或接口)*/public interface ManTikTok {void tiktok();}
/*** RealSubject: 真实主体角色(被代理对象类)*/public class LeiTikTok implements ManTikTok,SellTikTok {// @Overridepublic void tiktok() {System.out.println("雷丰阳,tiktok.... ");}@Overridepublic void sell() {System.out.println("雷丰阳,只要666,赶紧来包...");}public void haha(){System.out.println("hahaha ,......");}}
/*** Proxy: 代理主体角色* @param <T>*/public class JdkTiktokProxy<T> implements InvocationHandler {private T target;//接受被代理对象JdkTiktokProxy(T target){this.target = target;}/*** 获取被代理对象的 代理对象* @param t* @param <T>* @return*/public static<T> T getProxy(T t) {/*** ClassLoader loader, 当前被代理对象的类加载器* Class<?>[] interfaces, 当前被代理对象所实现的所有接口* InvocationHandler h,* 当前被代理对象执行目标方法的时候我们使用h可以定义拦截增强方法*/Object o = Proxy.newProxyInstance(t.getClass().getClassLoader(),t.getClass().getInterfaces(), //必须接口new JdkTiktokProxy(t));return (T)o;}/*** 定义目标方法的拦截逻辑;每个方法都会进来的** @param proxy* @param method* @param args* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy,Method method,Object[] args) throws Throwable {//反射执行System.out.println("真正执行被代理对象的方法");Object invoke = method.invoke(target, args);System.out.println("返回值:一堆美女");return invoke;}}
应用场景
- MyBatis的mapper到底是什么?怎么生成的?
Alibaba Seata的DataSourceProxy是什么?
DruidDataSource存在的Proxy模式
