proxy -物件結構型模式
阿新 • • 發佈:2018-12-18
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(); } }