代理模式,一种很重要的设计模式,除了自己可以在实际的代码中应用,好多框架也在使用,如AOP(更准确的来说这是一种设计思想)等。今天分享代理模式,主要从五点来说明:什么是代理模式、为什么要使用代理模式、怎么使用代理模式、代理模式的实现原理是怎么样的,代理模式的优缺点是什么。(乍一看这个分析是不是很像模板方法?对,没错,设计模式就是来源于我们的生活,我们在日常生活中或许不会太关注为什么要这样做,为什么要那样做,那是因为这已经成为了习惯,我的目标就是将设计模式融入到写代码的习惯中去,当然也不会去可以硬套设计模式。要理解设计模式是抽象出来为了帮助我们解决复杂问题的,而不要去为了硬套模式)
分割线---------------------------------------------------------------------------------------------------------------------------
1、代理模式
代理模式是一种行为模式,通俗点讲我不想做的事情想让你帮我代理做了。A有buy()方法,但是A不想自己做,就托付B去进行代理,同时B在代理的过程中也可以加入自己的逻辑。
2、为什么要用代理模式
为其他对象提供一种代理以控制对对象的访问。
3、如何使用。
1)静态代理
①接口抽象类,如Person,内含有buy()抽象方法;
②被代理对象,如Son,实现Person接口并实现相应的方法;
③代理对象,如Father,内部持有Person的引用,并构造构造器,创建方法去实现被代理对象的方法,也可以加入自己的逻辑;
④test,创建代理对象,执行代理对象的方法。
2)jdkProxy
①接口抽象类,如Person,内含有buy()抽象方法;
②被代理对象,如Son,实现Person接口并实现相应的方法;
③代理对象,如JdkProxy,需要实现invocationHandler接口
持有被代理对象的目标引用、创建代理对象的实例,通过invoke()去动态实现方法调用
3)cgligProxy
①某个Class,如A,内含有buy()方法
②代理类CglibProxy实现MethodInterceptor生成代理对象
- private Enhancer enhancer = new Enhancer();
- public Object getProxy(Class<?> clazz){
- enhancer.setSuperclass(clazz);
- enhancer.setCallback(this);
- return enhancer.create();
- }
- /**
- * 拦截所有目标类方法的调用
- * 参数:
- * obj目标实例对象
- *method 目标方法的反射对象
- * args方法的参数
- * proxy代理类的实例
- */
- public Object intercept(Object obj, Method method, Object[] args,
- MethodProxy proxy) throws Throwable {
- //代理类调用父类的方法
- proxy.invokeSuper(obj, args);
- return null;
- }
③测试test
4、代理的原理
最主要的就是在代理过程中发生了字节码重组。
5、(总结)代理的优缺点
动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理。在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样对每一个方法或方法组合进行处理。Proxy 很美很强大,但是仅支持 interface 代理。Java 的单继承机制注定了这些动态代理类们无法实现对 class 的动态代理。好在有cglib为Proxy提供了弥补。class与interface的区别本来就模糊,在java8中更是增加了一些新特性,使得interface越来越接近class,当有一日,java突破了单继承的限制,动态代理将会更加强大。