一:代理模式
在我们日常生活中,代理模式时时存在,比如我们购买商品,你不会直接去相应的工厂购买,而是通过代理,比如淘宝代理商,小区超市等代理商购买,而不会接触到真实的供应商完全由代理商转发我们的需求。代理模式使用对象聚合的方式代替继承从而降低模块间的耦合。
二:静态代理
我们首先使用静态代理来实现消费者通过代理商购买商品的行为。
2.1 定义接口
//红酒接口 public interface IRedWine { //红酒生产 public void product(); //红酒销售 public void sell(); }
2.2 接口实现类
public class RealRedWineFactory implements IRedWine { @Override public void product() { System.out.println("红酒生产..."); } @Override public void sell() { System.out.println("红酒销售..."); } }
2.3 静态代理类
package com.travelsky.pss.tanjie.staticstate.proxy; public class RedWineProxy implements IRedWine { // 静态代理类持有红酒生产接口类的实例 private IRedWine ireaWine; public RedWineProxy(IRedWine ireaWine) { this.ireaWine = ireaWine; } @Override public void product() { System.out.println("静态代理类执行红酒生产......."); ireaWine.product(); } @Override public void sell() { System.out.println("静态代理类执行红酒销售......."); ireaWine.sell(); } }
2.4 测试类
package com.travelsky.pss.tanjie.staticstate.proxy; public class StaticProxyMain { public static void main(String[] args) { IRedWine iRedWine = new RealRedWineFactory(); //创建代理对象实例 RedWineProxy proxy = new RedWineProxy(iRedWine); proxy.product(); proxy.sell(); } } ////////////////测试效果/////////////////////////////////////////// 静态代理类执行红酒生产....... 红酒生产... 静态代理类执行红酒销售....... 红酒销售...
上面的实现是一个非常简单的静态代理模式实现,下面我们开始接触动态代理。
三:动态代理
3.1 JDK动态代理实现
动态代理是在运行时生成代理对象,使用java.lang.reflect.Proxy生成动态代理对象时需要实现接口,以及InvacationHandler接口的真实处理对象handler给它。实际的行为处理由真实对象handler处理。
3.1.1 接口定义
package com.travelsky.pss.tanjie.dynamic.proxy; //JDK动态代理 public interface UserService { void addUser(); }
3.2.2 接口实现
package com.travelsky.pss.tanjie.dynamic.proxy; public class UserServiceImpl implements UserService { @Override public void addUser() { System.out.println("代理类实现...."); } }
3.3.3 JDK动态代理实现
package com.travelsky.pss.tanjie.dynamic.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; //JDK动态代理,在运行时,为那些没有统一的接口支持的类提供代理 public class MyInvcationHandler implements InvocationHandler { private Object target; public MyInvcationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("在代理之前............"); Object obj = method.invoke(target, args); System.out.println("在代理之后............"); return obj; } // 获取目标对象的代理对象 public Object getProxy() { return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(), this); } }
3.3.4 测试效果
package com.travelsky.pss.tanjie.dynamic.proxy; public class DynamicProxyMain { public static void main(String[] args) { UserService service = new UserServiceImpl(); MyInvcationHandler handler = new MyInvcationHandler(service); UserService userService = (UserService) handler.getProxy(); userService.addUser(); } } //////////////////////////运行效果//////////////////////////////// 在代理之前............ 代理类实现.... 在代理之后............
四:Cglib实例类的动态代理
对于未实现接口的类想进行代理的话可以使用cglib来实现
4.1 接口
package com.travelsky.pss.tanjie.cglib.proxy; public interface StudyJavaProxyCglib { public void beginStudyJavaProxy(); }
4.2 类实现
package com.travelsky.pss.tanjie.cglib.proxy; //代理类,不实现接口 public class StudyJavaProxyCglibImpl { public void beginStudyJavaProxy() { System.out.println("开始学习设计模式"); } }
4.3 cglib代理实现
package com.travelsky.pss.tanjie.cglib.proxy; import java.lang.reflect.Method; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class StudyJavaProxyCglibBridge implements MethodInterceptor { private Object target; /** * 创建代理对象 * * @param target * @return */ public Object getInstance(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); // 回调方法 enhancer.setCallback(this); // 创建代理对象 return enhancer.create(); } @Override // 回调方法 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("代理开始"); Object proxyObj = proxy.invokeSuper(obj, args); System.out.println("代理结束"); return proxyObj; } }
4.4 测试效果
package com.travelsky.pss.tanjie.cglib.proxy; public class TestCglib { public static void main(String[] args) { StudyJavaProxyCglibBridge cglib = new StudyJavaProxyCglibBridge(); StudyJavaProxyCglibImpl studyJavaProxyCglibImpl = (StudyJavaProxyCglibImpl) cglib .getInstance(new StudyJavaProxyCglibImpl()); studyJavaProxyCglibImpl.beginStudyJavaProxy(); } } /////////////////////////效果///////////////////////////////////// 代理开始 开始学习设计模式 代理结束