代理模式是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用。
代理分静态代理和动态代理
一、静态代理
代码示例
接口
- 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--成功