目录
使用代理优化用户管理类
原始模块
使用代理
测试执行
解决实际问题、掌握使用代理的好处
使用代理优化用户管理类
场景
- 某系统有一个用户管理类,包含用户登录,删除用户,查询用户等功能,系统要求统计每个功能的执行耗时情况,以便后期观察程序性能。
需求
- 现在,某个初级程序员已经开发好了该模块,请观察该模块的代码,找出目前存在的问题,并对其进行改造。
原始模块
用户业务接口
java">//用户业务接口
public interface UserService {//登录功能void login(String loginName,String passWord) throws Exception;//删除用户void deleteUsers() throws Exception;//查询用户,返回数组的形式String[] selectUsers() throws Exception;
}
用户业务实现类
java">//用户业务实现类(面向接口编程)
public class UserServiceImpl implements UserService{@Overridepublic void login(String loginName, String passWord) throws Exception {long startTime = System.currentTimeMillis();if("admin".equals(loginName) && "123456".equals(passWord)){System.out.println("您登录成功,欢迎光临本系统~");}else {System.out.println("您登录失败,用户名或密码错误!");}Thread.sleep(1000);long endTime = System.currentTimeMillis();System.out.println("login方法执行耗时:" + (endTime - startTime) / 1000.0 + "s");}@Overridepublic void deleteUsers() throws Exception {long startTime = System.currentTimeMillis();System.out.println("成功删除了1万个用户~");Thread.sleep(1500);long endTime = System.currentTimeMillis();System.out.println("deleteUsers方法执行耗时:" + (endTime - startTime) / 1000.0 + "s");}@Overridepublic String[] selectUsers() throws Exception {long startTime = System.currentTimeMillis();System.out.println("查询出了3个用户");String[] names = {"张全蛋","李二狗","牛爱花"};Thread.sleep(500);long endTime = System.currentTimeMillis();System.out.println("selectUsers方法执行耗时:" + (endTime - startTime) / 1000.0 + "s");return names;}
}
使用代理
代理类
java">import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyUtil {public static UserService createProxy(UserService userService){UserService userServiceProxy = (UserService) Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(),new Class[]{UserService.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if(method.getName().equals("login") || method.getName().equals("deleteUsers") ||method.getName().equals("selectUsers")){long startTime = System.currentTimeMillis();Object rs = method.invoke(userService,args);long endTime = System.currentTimeMillis();System.out.println(method.getName() + "方法执行耗时:" + (endTime - startTime) / 1000.0 + "s");return rs;}else {Object rs = method.invoke(userService,args);return rs;}}});return userServiceProxy;}
}
修改用户业务实现类
java">//用户业务实现类(面向接口编程)
public class UserServiceImpl implements UserService{@Overridepublic void login(String loginName, String passWord) throws Exception {if("admin".equals(loginName) && "123456".equals(passWord)){System.out.println("您登录成功,欢迎光临本系统~");}else {System.out.println("您登录失败,用户名或密码错误!");}Thread.sleep(1000);}@Overridepublic void deleteUsers() throws Exception {System.out.println("成功删除了1万个用户~");Thread.sleep(1500);}@Overridepublic String[] selectUsers() throws Exception {System.out.println("查询出了3个用户");String[] names = {"张全蛋","李二狗","牛爱花"};Thread.sleep(500);return names;}
}
测试执行
java">import java.lang.reflect.Array;
import java.util.Arrays;public class Test {public static void main(String[] args) throws Exception{//1.创建用户业务对象UserService userService = ProxyUtil.createProxy(new UserServiceImpl());//2.调用用户业务的功能。userService.login("admin","123456");System.out.println("---------------------------------");userService.deleteUsers();System.out.println("---------------------------------");String[] names = userService.selectUsers();System.out.println("查询到的用户是:" + Arrays.toString(names));System.out.println("---------------------------------");}
}
运行结果:
END
学习自:黑马程序员——Java课程