静态、动态代理实例

来源:互联网 发布:linux大作业 编辑:程序博客网 时间:2024/05/18 20:05

代理是一种比较好的降低耦合的方式,恩、我感觉是;最近学习老师讲解了比较简单容易理解的例子,做个笔记吧

动态代理:

代理:

public class LogHandler implements InvocationHandler {private Object targetObject;public Object newProxyInstance(Object targetObject) {this.targetObject = targetObject;// 返回一个指定接口的代理类实例,定义代理类的类加载器 代理类要实现的接口列表 指派方法调用的调用处理程序return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),targetObject.getClass().getInterfaces(), this);}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("invoke start--->" + method.getName());for (int s = 0; s < args.length; s++) {System.out.println(args[s]);}Object retObject = null;try {// 调用目标方法retObject = method.invoke(targetObject, args);System.out.println("invoke success---->" + method.getName());} catch (Exception e) {e.printStackTrace();throw e;}return retObject;}}

客户端:

public static void main(String[] args) {LogHandler logHandler = new LogHandler();UserManager userManager = (UserManager) logHandler.newProxyInstance(new UserManagerImpl());//调用代理的newProxyInstance方法userManager.addUser("0001", "张三");//通过动态代理调用方法}

接口类很简单,不写了,也是为了系统的灵活

实现类:

public class UserManagerImplProxy implements UserManager {private UserManager userManager;public UserManagerImplProxy(UserManager userName) {this.userManager = userName;}public void addUser(String userId, String userName) {try {System.out.println("UserManagerImplProxy start--->addUser() userId-->"+ userId);userManager.addUser(userId, userName);System.out.println("UserManagerImplProxy success-->addUser()");} catch (Exception e) {e.printStackTrace();System.out.println("UserManagerImplProxy errror---->addUser()");}}public void delUser(String userId) {System.out.println("UserManagerImpl.delUser() userId --->" + userId);}public void modifyUser(String userId, String userName) {System.out.println("UserManagerImpl.modifyUser() userId --->" + userId);}public String findUser(String userId) {System.out.println("UserManagerImpl.findUser() userId --->" + userId);return "张三";}}

结果:

invoke start--->addUser0001张三UserManagerImpl.addUser() userId --->0001invoke success---->addUser

静态代理

实现类一样,他的接口也是不变

public static void main(String[] args) {// UserManager userManager = new UserManagerImpl();// UserManager userManager = new UserManagerImplProxy(new// UserManagerImpl());// userManager.addUser("0001", "张三");}


代理类

public class UserManagerImplProxy implements UserManager {private UserManager userManager;public UserManagerImplProxy(UserManager userName) {this.userManager = userName;}public void addUser(String userId, String userName) {try {System.out.println("UserManagerImplProxy start--->addUser() userId-->"+ userId);userManager.addUser(userId, userName);System.out.println("UserManagerImplProxy success-->addUser()");} catch (Exception e) {e.printStackTrace();System.out.println("UserManagerImplProxy errror---->addUser()");}}public void delUser(String userId) {System.out.println("UserManagerImpl.delUser() userId --->" + userId);}public void modifyUser(String userId, String userName) {System.out.println("UserManagerImpl.modifyUser() userId --->" + userId);}public String findUser(String userId) {System.out.println("UserManagerImpl.findUser() userId --->" + userId);return "张三";}}

结果:

UserManagerImplProxy start--->addUser() userId-->0001UserManagerImpl.addUser() userId --->0001UserManagerImplProxy success-->addUser()

小结:

有一个博客写的很好,不班门弄斧了,直接粘贴过来:
代理(Proxy)设计模式提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.;这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法

举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明

星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决.

目标对象没有实现接口时用Cglib代理,也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展.

http://www.cnblogs.com/cenyu/p/6289209.html点击打开链接