标签:java设计模式 j2ee 实例 interface 程序开发
代理模式是常用的java设计模式,他的特征是代理类与目标类有同样的接口,代理类主要负责为目标类预处理消息、过滤消息、把消息转发给目标类,以及事后处理消息等。代理类与目标类之间通常会存在关联关系,一个代理类的对象与一个目标类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用目标类的对象的相关方法,来提供特定的服务。
结构图如下:
按照代理的创建时期,代理类可以分为静态代理和动态代理。
动态代理:在程序运行时,运用反射机制动态创建代理类(Proxy)而成。
package ZhuDan.Test; public interface UserManager { public void addUser(String UserId,String UserName); public void queryUser(String UserId); }UserManagerImpl目标类实现UserManager接口:
package ZhuDan.Test; public class UserManagerImpl implements UserManager { public void addUser(String UserId,String UserName) { System.out.println("用户ID:"+UserId); System.out.println("用户名:"+UserName); } public void queryUser(String UserId){ System.out.println("用户ID:"+UserId); } }UserManagerImplProxy代理类实现UserManager接口:
package ZhuDan.Test; public class UserManagerImplProxy implements UserManager { private UserManager userManager; public UserManagerImplProxy(UserManager userManager){ this.userManager=userManager; } public void addUser(String UserId,String UserName) { try{ System.out.println("~~~~~~~~~~addUser开始执行~~~~~~~~~~~"); userManager.addUser( UserId,UserName); }catch(Exception e){ e.printStackTrace(); System.out.print("~~~~~~~~~~addUser执行出错~~~~~~~~~~~"); }finally{ System.out.print("~~~~~~~~~~addUser成功执行~~~~~~~~~~~"); } } public void queryUser(String UserId){ try{ System.out.println("~~~~~~~~~~queryUser开始执行~~~~~~~~~~~"); userManager.queryUser( UserId); }catch(Exception e){ e.printStackTrace(); System.out.print("~~~~~~~~~~queryUser执行出错~~~~~~~~~~~"); }finally{ System.out.print("~~~~~~~~~~queryUser成功执行~~~~~~~~~~~"); } } }
package ZhuDan.Test; public class Manager { public static void main(String args[]){ UserManager userManager=new UserManagerImplProxy(new UserManagerImpl()); userManager.addUser("0001", "张三"); userManager.queryUser("0001"); } }
package ZhuDan.Test; public interface UserManager { public void FindUserById(String UserId); public void addUser(String UserId,String UserName); }UserManagerImpl目标类实现UserManager接口:
package ZhuDan.Test; public class UserManagerImpl implements UserManager { public void addUser(String UserId,String UserName) { System.out.println("用户ID:"+UserId); System.out.println("用户名:"+UserName); } public void FindUserById(String UserId){ System.out.println("用户ID:"+UserId); } }UserManagerImplProxy代理类实现InvocationHandler接口:
package ZhuDan.Test1; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class UserManageProxy implements InvocationHandler { private Object target; /** * 绑定委托对象并返回一个代理类 * @param target * @return */ public Object bind(Object target) { //目标 this.target = target; ClassLoader str= target.getClass().getClassLoader(); //取得代理对象 //newProxyInstance三个参数:代理类的装载器、接口、指派方法调用的调用处理程序 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } //args:包装所有参数 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result=null; System.out.println("~~~~~~~~~~"+method.getName()+" 开始执行~~~~~~~~~~~"); //取得参数 for(int i=0;i<args.length;i++){ System.out.println("《~~~~~~~~~~参数为:"+args[i]+"~~~~~~~~~~~》"); } try{ //执行方法 ,添加方法就是target,args是参数 result=method.invoke(target, args); System.out.println("~~~~~~~~~~"+method.getName()+" 成功执行~~~~~~~~~~~"); }catch(Exception e){ e.printStackTrace(); System.out.print("~~~~~~~~~~"+method.getName()+"执行出错~~~~~~~~~~~"); } return result; } }Manager类:
package ZhuDan.Test1; public class Manager { public static void main(String args[]){ UserManageProxy userManagerProxy=new UserManageProxy(); UserManager userManager=(UserManager)userManagerProxy.bind(new UserManagerImpl()); userManager.FindUserById("0001"); userManager.addUser("0001", "张三"); } }输出结果:
代理模式(静态代理+动态代理)——JAVA,布布扣,bubuko.com
标签:java设计模式 j2ee 实例 interface 程序开发
原文地址:http://blog.csdn.net/dandanzmc/article/details/38387213