无处不在的模式——Proxy
最近在看《设计模式之禅》,看到代理模式这一章的时候,发现自己在写spring项目的时候其实很多时候都用到了代理,无论是依赖注入、AOP还是其他,可以说是无处不在。
于是自己便自己摸索写了一些小例子,当然也参考了网上其他博主的博客,毕竟小白一枚hhhhhh
进入正题:
图1-1:代理Proxy
代理模式现在主流的有两大类:1、JDK代理 2、CGLB代理
(JDK静态代理就不说了,网上很多都有,主要我觉得现在面向企业项目,静态代理局限性有点大,对于我而言可能就只是去了解了一下,而并没有说想要去深入这个)
Th1:JDK动态接口代理(需要实现InvocationHandler接口中的invoke(...)方法,必须实现某个接口)
public class MyJdkProxy implements InvocationHandler { // 目标对象 public Object target; // 初始化传入代理对象 public MyJdkProxy(Object target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("xsc"); return method.invoke(target,args); } public Object newProxy(){ // 获取代理目标对象实例 return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), this ); } }
Th2:CGLB动态接口代理(需要实现MethodInterceptor接口中的intercept(...)方法,当然也可无需实现接口,可直接代理类)
public class MyCgljProxy implements MethodInterceptor { // 目标对象 public Object target; // 初始化传入代理对象 public MyCgljProxy(Object target){ this.target = target; } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("cj"); return methodProxy.invoke(target,objects); } public Object newProxy(){ // 获取代理目标对象实例 return Enhancer.create(target.getClass(),this); } }
Th3:测试类Test.java
public class Test{ // 需要代理的接口 interface Subject{ void sayHi(); void sayHallo(); } // 代理接口实现类 static class SubjectImpl implements Subject{ @Override public void sayHi() { System.out.println("Hi"); } @Override public void sayHallo() { System.out.println("Hello"); } } public static void main(String[] args) { // JDK动态接口代理方式 Subject target1 = new SubjectImpl(); MyJdkProxy proxy = new MyJdkProxy(target1); target1 = (Subject) proxy.newProxy(); target1.sayHallo(); target1.sayHi(); System.out.println("----------------------------"); // CGLB动态接口代理方式 Subject target2 = new SubjectImpl(); MyCgljProxy myCgljProxy = new MyCgljProxy(target2); target2 = (Subject) myCgljProxy.newProxy(); target2.sayHi(); target2.sayHallo(); } }
Th4:测试结果
总结:
当然这些只是简单的代理,感觉其实一通百通,目的都是为对象提供个代理来控制对其的访问,而我们的代理类则委托预处理、过滤、转发消息,以及委托后进行的后续处理,解决了在直接访问对象时可能带来的问题
革命尚未成功,同志仍需努力~~~~
原文地址:https://www.cnblogs.com/xscc/p/11320473.html
时间: 2024-10-06 23:46:35