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)安全控制
最經典的,什麼最危險的事都是替身乾的