java代理模式

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)安全控制

最經典的,什麼最危險的事都是替身乾的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章