Java静态代理
2016-03-23 10:19
656 查看
之前一直不太懂静态代理和动态代理的区别,看drp终于是清晰一些了……
代理模式:它是一种结构型模式,就是给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用。代理类和委托类有共同的父接口,这样使用委托类对象的地方都可以使用代理类对象代替。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。
那么是如何划分静态代理和动态代理的呢?是根据代理类生成的时间不同划分的。
其实我们可以看到上面的代理类中,也是有许多的代码是重复的。这时我们想到了AOP,面向切面编程,如果可以横着切一刀可以实现减少重复的代码,那就太好了,动态代理是可以实现的。
缺点:代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
代理模式:它是一种结构型模式,就是给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用。代理类和委托类有共同的父接口,这样使用委托类对象的地方都可以使用代理类对象代替。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。
那么是如何划分静态代理和动态代理的呢?是根据代理类生成的时间不同划分的。
静态代理
静态代理就是简单代理模式的一种体现,代理类是在程序运行前就已经存在代理类的字节码文件中,代理类和委托类的关系在运行前就确定了。实现代码:
清单一:代理接口
public interface UserManager { public void addUser(String userId,String userName); public void delUser(String userId); }
清单二:委托类
public class UserManagerImpl implements UserManager { public void addUser(String userId, String userName) { try { System.out.println("UserManagerImpl.addUser() userId-->>"+ userId); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); } } public void delUser(String userId) { System.out.println("UserManagerImpl.delUser() userId-->>"+ userId); } }
清单三:代理类
public class UserManagerImplProxy implements UserManager { private UserManager userManager; public UserManagerImplProxy(UserManager userManager) { try { System.out.println("start-->>addUser() userId-->>" + userId); userManager.addUser(userId, userName); System.out.println("success-->>addUser()"); }catch(Exception e) { e.printStackTrace(); System.out.println("error-->>addUser()"); } } public void delUser(String userId) { try { System.out.println("start-->>addUser() userId-->>" + userId); userManager.delUser(userId); System.out.println("success-->>addUser()"); }catch(Exception e) { e.printStackTrace(); System.out.println("error-->>addUser()"); } } }
清单四:客户类
public class Client { public static void main(String[] args) { UserManager userManager=new UserManagerImplProxy(new UserManagerImpl()); userManager.addUser("0001", "张三"); } }
其实我们可以看到上面的代理类中,也是有许多的代码是重复的。这时我们想到了AOP,面向切面编程,如果可以横着切一刀可以实现减少重复的代码,那就太好了,动态代理是可以实现的。
静态代理的优缺点
优点:业务类只需要关注业务逻辑本身,保证了业务类的重用行。这是代理的共同优点。缺点:代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
相关文章推荐
- 反射+javacsv+scv文件构建资源获取
- 手写的日期排序 数组作为参数传入排序函数,输出时需要override String类中的 toString
- Spring Security (14)权限鉴定基础
- Java 使用Token令牌防止表单重复提交
- java中定义一个类可以同时继承两个类
- Java中 NIO与IO的区别
- MyBatis自定义分页插件
- Java --- Thread VS Process
- Java scanner获取键盘输入
- 快速排序的java实现
- java中的类c继承了b,b继承了a,c可以直接调用a的方法吗?怎么调用。
- java 反编译工具:JD-GUI、JD-Eclipse、JD-IntelliJ
- Java 日期
- Java——SAX方式生成XML
- java验证码-汉字验证码
- javaWeb项目2webService
- Spring的事务及五种配置方式
- 【JAVA】使用Eclipse依赖生成jar包时,避免最外层同时生成资源文件的配置。
- java String 转成Double二维数组
- 移除class中多引用的类