1. 什么是代理?
在计算机程序设计的时候,我们对某些对象进行了封装。但是我们又要对封装了的对象进行操作和修改,如何在保障在不改变原有对象的情况下,实现对原始对象的操作。这里我们可以通过新建一个原始对象备份来实现对原始对象的操作。这个备份的对象我们就可以认为就是原始对象的代理。
2. 如何实现代理
通过面向接口编程,首先我们引入
l 静态代理的概念
接口:
class UserManager{
Public void addUser(User user);
………
}
接口实现:
class UserManagerImpl implements UserManager{
Public void addUser(User user){
System.out.println(“向数据添加一个用户”);
}
………
}
代理类:
/**在添加用户的时候判断用户有没有权限,有的话则做添加动作 */
//此处代理类跟原始类实现了同一个接口
Class ProxyUserManagerImpl implemets UserManager{
Private UserManager targetUsermanager;
//对userManager进行实例化
Public ProxyUserManagerImpl(){
//将要进行操作的原始对象
targetUsermanager = new UserManagerImpl();
}
Public void addUser(User user){
//在添加对象之前进行安全检查
checkSecurity();
//在代理类中操作原始对象
targetUsermanager.addUser(user);
}
Public void checkSecurity()
{
System.out.println(“检查用户安全”);
}
}
以上程序依赖性太强,为了减少目标对象和代理对象之间的依赖。
l 动态代理
就是在程序对目标对象进行调用的时候创建目标对象的代理。
Class ProxyDynicaUserManager implements InvocationHandler{
//因为不知道目标对象的类型,此处采用向上造型, 设定要操作的目标对象
Private Object targetObject;
//创建目标对象的代理
Public Object createTargetObjectInstance(Object targetObject){
This.targetObject = targetObject;
Object object =
Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this);
return object;
}
//操作目标对象的方法
Public Object invoke(Object proxy,Method method,Object[] args){
//在调用目标对象之前,进行安全检查
checkSecurity();
//调用目标对象的方法
Object object = method.invoke(targetObject,args);
Return object;
}
//进行安全检查
Public void checkSecurity(){
System.out.println(“安全检查开始”);
}
}
下一篇将引入AOP的概念