動態代理模式和靜態代理模式
阿新 • • 發佈:2020-10-07
靜態代理模式:首先我們開看一張圖
靜態代理或者動態代理我們要明白代理其中代理的意思:就是通過一個媒介去代理來達成某個目的
上圖中相親網站就代理了廣大相親的美麗女士去和劉建龍進行約會(這個代理的順序很重要,而不是相親公司代理劉建龍)
這裡引用b站狂神的幾句經典的話
由此可見:廣大女性(Lady真實角色)有約會(Date抽象角色)的需求,婚慶公司(proxy代理角色)幫助實現,客戶(Client劉建龍)
demo結構:
程式碼:
public interface Date { void date(); }
public class Lady implements Date {public void date() { System.out.println("與劉建龍甜蜜的約會成功"); } }
public class Proxy implements Date { //組合進去 Lady lady; public Proxy() { } public Proxy(Lady lady) { this.lady = lady; } public void date() { lady.date(); } }
public class Client {public static void main(String[] args) { Lady lady = new Lady(); Proxy proxy = new Proxy(lady); proxy.date(); } }
值得注意的是,在寫代理類的時候,要把你要代理的引用放進去,之後Client中的執行結果:
那麼動態代理就是自動的生成你所要代理的類(相當於自動給你生成一個proxy)
那麼就需要一個工具類:
//等會我們會用這個類來自動生成代理類 public class ProxyInvocationHandler implementsInvocationHandler { //被代理的介面 //代理誰 private Object target; public void setTarget(Object target) { this.target = target; } //生成得到代理類 //生成代理類 public Object getProxy(){ return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } //處理代理例項,並返回結果 //呼叫代理程式的一些執行方法 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //動態代理的本質就是使用反射機制實現 Object result = method.invoke(target, args); return result; } }
運用了反射的知識
public class Client { public static void main(String[] args) { Lady lady = new Lady(); ProxyInvocationHandler pih = new ProxyInvocationHandler(); pih.setTarget(lady); Date proxy = (Date) pih.getProxy(); proxy.date(); } }
執行結果也是一樣的
關鍵是要弄清楚你要代理哪一個真實的角色,才是代理的關鍵