1. 程式人生 > 實用技巧 >動態代理模式和靜態代理模式

動態代理模式和靜態代理模式

靜態代理模式:首先我們開看一張圖

靜態代理或者動態代理我們要明白代理其中代理的意思:就是通過一個媒介去代理來達成某個目的

上圖中相親網站就代理了廣大相親的美麗女士去和劉建龍進行約會(這個代理的順序很重要,而不是相親公司代理劉建龍)

這裡引用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 implements
InvocationHandler { //被代理的介面 //代理誰 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();
    }
}

執行結果也是一樣的

關鍵是要弄清楚你要代理哪一個真實的角色,才是代理的關鍵