1.什么是代理模式
2.java代理模式实现demo
首先定义好接口Subject
package proxy;
public interface Subject {
public void request();
public void response();
}
接着实现类RealSubject 继承Subject 接口
package proxy;
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("I am the request method!");
}
@Override
public void response() {
System.out.println("I am response method!");
}
}
接着创建动态代理类DynamicSubject实现InvocationHandler接口
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class DynamicSubject implements InvocationHandler {
private Object sub;
public DynamicSubject(Object obj) {
this.sub = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("before : " + method);//在方法前执行
method.invoke(sub, args);
System.out.println("after : " + method);//在方法后执行
return null;
}
}
最后测试类如下
package proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import org.junit.Test;
public class TestProxy {
@Test
public void TestDynamicProxy() {
RealSubject realSubject = new RealSubject();
InvocationHandler handler = new DynamicSubject(realSubject);
// .getInterfaces() 返回本类直接实现的接口.不包含泛型参数信息
Subject subject = (Subject) Proxy.newProxyInstance(handler.getClass()
.getClassLoader(), realSubject.getClass().getInterfaces(),
handler);
// subject.request();
subject.response();
}
}
运行测试类结果如下
before : public abstract void proxy.Subject.request()
I am the request method!
after : public abstract void proxy.Subject.request()
before : public abstract void proxy.Subject.response()
I am response method!
after : public abstract void proxy.Subject.response()
3.代理模式主要有哪些应用场景
1)webservice远程代理
如在一个web项目中来一些外部引用,添加一些WebReference和文件,这些文件就是远程web工程的引用,
2)虚拟代理
如用一些虚拟对象代理一些实例化需要很长时间,开销很大的文件,如你打开一个HTML文件,可能文字会很快的显示出来,但图片你却的等它慢慢的一张一张下载,这时候图片框其实就是一个代理对象,代理了真实图片的位置和尺寸.
3)安全控制
最经典的,什么最危险的事都是替身干的