代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。简单的说就是,我们在访问实际对象时,是通过代理对象来访问的,代理模式就是在访问实际对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。
public static void main(String[] args) {
//创建一个与代理对象相关联的LogHandler
LogHandler logHandler = new LogHandler();
//通过构造器constructor来创建一个动态实例userManager
UserManager userManager = (UserManager) logHandler.createInstance(new UserManagerIpml());
userManager.addUser();
userManager.findUser();
}
public interface UserManager {
public void addUser();
public void findUser();
}
public class UserManagerIpml implements UserManager {
@Override
public void addUser() {
System.out.println("-----------addUser----------");
}
@Override
public void findUser() {
System.out.println("-----------findUser----------");
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogHandler implements InvocationHandler {
private Object object;
public Object createInstance(Object object) {
this.object = object;
//在java的java.lang.reflect包下提供了一个Proxy类和一个InvocationHandler接口,通过这个类和这个接口可以生成JDK动态代理类和动态代理对象。
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//代理方法首先执行增加日志的方法
addLog();
//真正执行的方法
Object o = method.invoke(object, args);
//将返回值返回
return o;
}
private void addLog(){
System.out.println("--------------增加log-------------");
}
}
` 其中InvocationHandler的invoke方法如下:
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable;`
Object proxy 执行方法的代理对象
Method method 被执行的方法的对象
Object[] args 被执行的方法的参数
返回值则是代理对象调用方法时所返回的值
`
执行过程
输出
--------------增加log-------------
-----------addUser----------
--------------增加log-------------
-----------findUser----------