1. 程式人生 > >proxy -物件結構型模式

proxy -物件結構型模式

        1.意圖
                     為其它物件提供一種代理以控制對這個物件的訪問
         2.參與者
           Proxy - 儲存一個引用使得代理可以訪問實體
                 - 提供一個和subject的介面相同的介面
                 - 控制對實體的存取,並可能的建立和刪除它
                 - 其它功能依賴於代理型別
                   Remote Proxy 負責請求及其引數進行編碼,並向不同的地址空間
                                                                傳送已編碼的請求
                   Virtual Proxy 可以快取實體的附加資訊,以便延遲對它的訪問
                   
                   Protection Proxy 檢查呼叫者是否具有實現一個請求所需的訪問許可權
          Subject - 定義RealSubject和Proxy的共有介面
          
          RealSubject - 實現Proxy所代表的實體  

3.結構

4.程式碼

public interface Subject {
     void draw();
}

public class RealSubject implements Subject {

	@Override
	public void draw() {
		System.out.println("大物件");
	}

}

public class VirtualProxy implements Subject {
	private Subject subject;
	@Override
	public void draw() {
		if(subject == null){
			subject = new RealSubject();
		}
		subject.draw();
	}

}

public class ProtectionProxy implements Subject {
	private Subject subject = new RealSubject();
	private List<String> safeClass = new ArrayList<String>();
	ProtectionProxy(){
		safeClass.add("designPattern.structModel.proxy.Client");
	}
	@Override
	public void draw() {
     boolean b = safeCheck();
     if(b){
    	 subject.draw();
     }
	}
	private boolean safeCheck() {
		StackTraceElement[] stack = (new Throwable()).getStackTrace();
		StackTraceElement caller;
		if(stack.length>2){
			caller = stack[2];
		}else{
			return false;
		}
		String className = caller.getClassName();
		System.out.println(className);
		for(String str :safeClass){
			if(className.equals(str)){
				return true;
			}
		}
		return false;
	}
  
}

public class Client {
	public static void main(String[] args) {
		ProtectionProxy proxy = new ProtectionProxy();
		VirtualProxy virtualProxy = new VirtualProxy();
		virtualProxy.draw();
		proxy.draw();

	}
}