问题:我们有一个实现类,分别有添加、删除、更新、查询等方法,如果我们现在要在执行方法加一个验证权限的方法,我们该如何做呢?有人会这还不简单,新建一个方法,在每个方法前调用一个就行。这种是可以完成功能,但它不够灵活,也破坏了我们的原有的代码。那该如何做才能更灵活呢?我们现在用jdk提供的动态代理模式来实现。
首先,我们新建一个接口UserManager
public interface UserManager {
public void addUser(String username, String password);
public void deleteUser(int id);
public void modifyUser(int id, String username, String password);
public String findUserById(int id);
}
然后,在写一个实现类实现这个接口UserManagerImpl.java
public class UserManagerImpl implements UserManager {
public void addUser(String username, String password) {
System.out.println("----UserManagerImpl.addUser()--------");
}
public void deleteUser(int id) {
System.out.println("------UserManagerImpl.deleteUser()-------");
}
public String findUserById(int id) {
System.out.println("----UserManagerImpl.findUserById()------");
return null;
}
public void modifyUser(int id, String username, String password) {
System.out.println("-------UserManagerImpl.modifyUser()------");
}
}
其次,写一个代理类SecurityHandler,生成我们实现类的代理类,我们将在这个加上验证权限的方法。
public class SecurityHandler implements InvocationHandler {
private Object targetObject;
public Object newProxy(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 {
checkSecurity();
Object ret = null;
try {
ret = method.invoke(this.targetObject, args);
}catch(Exception e) {
e.printStackTrace();
throw new java.lang.RuntimeException(e);
}
return ret;
}
private void checkSecurity() {
System.out.println("----------checkSecurity()------------");
}
}
最后,我们写一个测试类来进行测试一下。
public class Client {
public static void main(String[] args) {
SecurityHandler handler = new SecurityHandler();
UserManager userManager =
(UserManager)handler.newProxy(new UserManagerImpl());
userManager.deleteUser(1);
}
}