代理模式(Proxy)
代理模式是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用。
代理分静态代理和动态代理
一、静态代理
代码示例
接口
package com.jialinl; public interface InterfaceUserManage { public void AddUser(); public void DelUser(); public void ModifyUser(); }
目标类
package com.jialinl; public class UserManageImp implements InterfaceUserManage { @Override public void AddUser() { System.out.println("UserManageImp>>>>>AddUser"); } @Override public void DelUser() { System.out.println("UserManageImp>>>>>DelUser"); } @Override public void ModifyUser() { System.out.println("UserManageImp>>>>>ModifyUser"); } }
代理类
package com.jialinl; public class UserManageImpProxy implements InterfaceUserManage { private InterfaceUserManage userManage; public UserManageImpProxy(InterfaceUserManage userManage) { this.userManage = userManage; } @Override public void AddUser() { try { //记录日志等操作,完全可以使用代理来完成 System.out.println("start-->>addUser()"); userManage.AddUser(); System.out.println("success-->>addUser()"); }catch(Exception e) { e.printStackTrace(); System.out.println("error-->>addUser()"); } } @Override public void DelUser() { //代理操作。。。。。 userManage.DelUser(); } @Override public void ModifyUser() { //代理操作。。。。。 userManage.ModifyUser(); } }
客户端调用
package com.jialinl; public class Client { public static void main(String[] args) { InterfaceUserManage userManager = new UserManageImpProxy(new UserManageImp()); userManager.AddUser(); } }
输出结果
start-->>addUser()
UserManageImp>>>>>AddUser
success-->>addUser()
从UML图和代码分析可以看出,静态代理会建立大量的类,一个接口基本对应一个代理类,而且(代理操作)重复的代码在每个方法中都有出现,我们应该杜绝这种重复。下面就要看我们的动态代理。
二、动态代理
JDK动态代理能对实现了接口的类进行代理,采用JDK动态代理必须实现InvocationHandler接口,采用Proxy类创建相应的代理类。
代码示例:
接口
package com.jialin; public interface InterfaceUserManage { public void AddUser(String userName,String userAge); public void DelUser(); public void ModifyUser(); }
目标类
package com.jialin; public class UserManageImp implements InterfaceUserManage { @Override public void AddUser(String userName,String userAge) { System.out.println("UserManageImp>>>>>AddUser("+userName+","+userAge+")"); } @Override public void DelUser() { System.out.println("UserManageImp>>>>>DelUser"); } @Override public void ModifyUser() { System.out.println("UserManageImp>>>>>ModifyUser"); } }
代理
package com.jialin; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class PublicProxy 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("开始调用目标方法-->>" + method.getName()); for (int i=0; i<args.length; i++) { //打印调用目标方法的参数 System.out.println(args[i]); } try { //调用目标方法 method.invoke(targetObject, args); System.out.println("调用-->>" + method.getName()+"--成功"); }catch(Exception e) { e.printStackTrace(); System.out.println("调用-->>" + method.getName()+"--失败"); throw e; } return null; } }
客户端
package com.jialin; public class Client { public static void main(String[] args) { PublicProxy publicProxy = new PublicProxy(); InterfaceUserManage userManager = (InterfaceUserManage)publicProxy.newProxyInstance(new UserManageImp()); userManager.AddUser("王五","17"); } }
输出结果:
开始调用目标方法-->>AddUser
王五
17
UserManageImp>>>>>AddUser(王五,17)
调用-->>AddUser--成功