经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
代理模式
来源:cnblogs  作者:kangaroohu  时间:2018/9/25 20:18:35  对本文有异议
代理模式的定义很简单:给某一对象提供一个代理对象,并由代理对象控制对原对象的引用

静态代理

静态代理为业务实现类和业务代理类两部分组成,业务实现类负责实现主要的业务方法,业务代理类负责对调用的业务方法预处理,调用业务时,不是直接通过业务实现类来调用的,而是通过业务代理类的同名方法来调用被代理类处理过的业务方法
  1. public class UserDaoProxy implements IUserDao{
  2. private IUserDao userDao;
  3. public UserDaoProxy(IUserDao userDao) {
  4. this.userDao = userDao;
  5. }
  6. @Override
  7. public void save() {
  8. System.out.println("开启事务");//扩展了额外功能
  9. userDao.save();
  10. System.out.println("提交事务");
  11. }
  12. }

动态代理

在程序运行时运用反射机制动态创建而成

jdk动态代理

只能代理实现了接口的类,代理对象本身并不真正实现服务,而是通过调用委托类的对象相关方法,提供特定服务,通过接口中的方法名,在动态生成的代理类中调用委托实现类的同名方法
定义业务逻辑接口,实现业务逻辑接口创建业务实现类
  1. public class BookFacadeProxy implements InvocationHandler {
  2. private Object target;//这其实业务实现类对象,用来调用具体的业务方法
  3. /**
  4. * 绑定业务对象并返回一个代理类
  5. */
  6. public Object bind(Object target) {
  7. this.target = target; //接收业务实现类对象参数
  8. //通过反射机制,创建一个代理类对象实例并返回,用户进行方法调用时使用,创建代理对象时,需要传递该业务类的类加载器、全部的接口、代理类实例
  9. return Proxy.newProxyInstance(target.getClass().getClassLoader(),
  10. target.getClass().getInterfaces(), this); }
  11. /**
  12. * 包装调用方法:进行预处理、调用后处理
  13. */
  14. public Object invoke(Object proxy, Method method, Object[] args)
  15. throws Throwable {
  16. Object result=null;
  17. System.out.println("预处理操作——————");
  18. //调用真正的业务方法
  19. result=method.invoke(target, args);
  20. System.out.println("调用后处理——————");
  21. return result;
  22. }
  23. }

cglib动态代理

针对类实现代理,通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑,通过继承业务类,生成的动态代理类是业务类的子类,通过重写业务方法进行代理
  1. public class BookFacadeCglib implements MethodInterceptor {
  2. private Object target;//业务类对象,供代理方法中进行真正的业务方法调用
  3. //相当于JDK动态代理中的绑定
  4. public Object getInstance(Object target) {
  5. this.target = target; //给业务对象赋值
  6. Enhancer enhancer = new Enhancer(); //创建加强器,用来创建动态代理类
  7. enhancer.setSuperclass(this.target.getClass()); //为加强器指定要代理的业务类(即:为下面生成的代理类指定父类)
  8. //设置回调:对于代理类上所有方法的调用,都会调用CallBack,而Callback则需要实现intercept()方法进行拦截/预处理
  9. enhancer.setCallback(this);
  10. // 创建动态代理类对象并返回
  11. return enhancer.create();
  12. }
  13. // 实现回调方法
  14. public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
  15. System.out.println("预处理——————");
  16. proxy.invokeSuper(obj, args); //调用业务类(父类中)的方法
  17. System.out.println("调用后操作——————");
  18. return null;
  19. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号