1.代理模式
代理模式为其它对象提供一种代理以控制这个对象的访问,主要解决在直接访问对象时带来的问题,有些对象由于某些原因,直接访问会给使用者或者系统带来很多麻烦,此时我们可以在访问此对象时加一个对该对象的访问层;不能直接操作目标对象,要访问它必须通过代理类访问,代理类可以完成目标对象的操作,还可以延展其他的操作,脏活累活它全揽;
2.静态代理
静态代理类必须持有目标对象的引用,以便达到操作目标对象的目的
①抽象接口类
public interface Subject { void visit(int channel); }
②目标(真实)对象类
** * 委托类 */ public class RealSubject implements Subject { @Override public void visit(int channel) { if(channel == 1) { System.out.println("我是静态委托类"); }else { System.out.println("我是动态委托类"); } } }
③静态代理类
public class StaticProxy implements Subject { private RealSubject subject; public StaticProxy(RealSubject subject){ this.subject = subject; } @Override public void visit(int channel) { subject.visit(channel); } }
④测试类
public class StaticClient { public static void main(String[] args) { StaticProxy proxySubject = new StaticProxy(new RealSubject()); //代理类 proxySubject.visit(1); } }
效果图:
3.Jdk动态代理
如果目标对象实现了接口,则采用jdk动态代理
①Jdk动态代理类
/** * 动态代理类 */ public class JDKProxy implements InvocationHandler { private Object target; public JDKProxy(Object object) { this.target = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = method.invoke(target, args); return result; } }
②测试类
public static void main(String[] args) { Subject realSubject = new RealSubject(); JDKProxy proxy = new JDKProxy(realSubject); ClassLoader classLoader = realSubject.getClass().getClassLoader(); Subject subject = (Subject)Proxy.newProxyInstance(classLoader, new Class[]{Subject.class}, proxy); subject.visit(2); }
效果图:
4.Cglib动态代理
如果目标对象没有实现接口,则采用cglib动态代理;spring-Aop是典型的cglib动态代理案例
①目标对象类
public class CglibSubject { public void visit(){ System.out.println("我是cglib动态代理"); } }
②cglib动态代理类
/** * @auther zx * @date 2018/6/20 11:15 * * 引入的目标对象没有实现接口,使用cglib代理 */ public class CglibProxy implements MethodInterceptor { private Object target; public CglibProxy(Object object){ this.target = object; } //给目标对象创建一个代理对象 public Object getProxyInstance(){ //1.工具类 Enhancer en = new Enhancer(); //2.设置父类 en.setSuperclass(target.getClass()); //3.设置回调函数 en.setCallback(this); //4.创建子类(代理对象) return en.create(); } @Override public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { //执行目标对象的方法 Object returnValue = method.invoke(target, args); return returnValue; } }
③测试类
public class CglibClient { public static void main(String[] args) { //目标对象 CglibSubject target = new CglibSubject(); //代理对象 CglibSubject proxy = (CglibSubject)new CglibProxy(target).getProxyInstance(); //执行代理对象的方法 proxy.visit(); } }
效果图:
好了,我是张星,欢迎加入博主技术交流群,群号:526601468