描述
代理模式(Proxy Pattern) ,给某一个对象提供一个代理,并由代理对象控制对原对象的引用,对象结构型模式。这种也是静态代理 ,静态代理和包装模式非常相似

主要角色
代理模式包含如下角色:
- Subject: 抽象主体角色(抽象类或接口)
- Proxy: 代理主体角色(代理对象类)
- RealSubject: 真实主体角色(被代理对象类)
代码实现-JDK动态代理
public interface TikTok {String liveStreaming();}
public class Lshady_TikTok implements TikTok{@Overridepublic String liveStreaming() {return "lshady=>开始直播";}}
public class ProxyTiktok implements InvocationHandler {private Object object;public ProxyTiktok(Object object) {this.object = object;}public static <T> T getProxy(T t){Object o = Proxy.newProxyInstance(t.getClass().getClassLoader(),//当前被代理对象的类加载器t.getClass().getInterfaces(),//当前被代理对象所实现的所有接口new ProxyTiktok(t));//当前被代理对象执行目标方法的时候我们使用可以定义拦截增强方法return (T)o;}//定义目标方法的拦截逻辑:每一个方法都会进来@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("代理对象代理直播");//接口无实现 此方法不用传入 可以实现 声明试调用 mybatis openfeign 实现原理//反射执行Object invoke = method.invoke(object);//代理对象需要增强的逻辑return invoke;}}
//动态代理模式 代理对象和目标对象的相同点在于都是同一个接口public class ProxyTest {public static void main(String[] args) {TikTok lshady_tikTok = new Lshady_TikTok();lshady_tikTok.liveStreaming();TikTok proxy = ProxyTiktok.getProxy(lshady_tikTok);String s = proxy.liveStreaming();System.out.println(s);}}//测试结果代理对象代理直播lshady=>开始直播
代码实现-cglib动态代理
public class Ls_TikTok{public String liveStreaming() {return "lshady=>开始直播";}}
public class CglibProxyTiktok{public static <T> T createProxy(T t){//创建一个增强器Enhancer enhancer = new Enhancer();//设置父类enhancer.setSuperclass(t.getClass());//设置回调enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object o,Method method,//为了能获取的原方法的一些元数据Object[] objects,MethodProxy methodProxy) throws Throwable {//编写拦截代理的逻辑System.out.println("cglib登场。。。");Object o1 = methodProxy.invokeSuper(o, objects);//执行目标方法return o1;}});//创建一个代理对象return (T) enhancer.create();}}
public static void main(String[] args) {Ls_TikTok ls_tikTok = new Ls_TikTok();String s = ls_tikTok.liveStreaming();System.out.println(s);Ls_TikTok proxy = CglibProxyTiktok.createProxy(ls_tikTok);String s1 = proxy.liveStreaming();System.out.println(s1);}//测试lshady=>开始直播cglib登场。。。lshady=>开始直播
使用场景
什么场景用到?
- MyBatis的mapper到底是什么?怎么生成的?
- 动态代理 UserMapper、CityMapper,mybatis帮我们写实现MapperProxy Alibaba
- Seata的DataSourceProxy是什么?
- DruidDataSource存在的Proxy模式
- 监控链
- … ……
