1. 程式人生 > 其它 >08、Java模式--代理模式

08、Java模式--代理模式

代理模式

由於某些原因需要給某物件提供一個代理以控制對該物件的訪問。這時,訪問物件不適合或者不能直接引用目標物件,代理物件作為訪問物件和目標物件之間的中介。

代理模式的主要優點有:

  • 代理模式在客戶端與目標物件之間起到一箇中介作用和保護目標物件的作用;
  • 代理物件可以擴充套件目標物件的功能;
  • 代理模式能將客戶端與目標物件分離,在一定程度上降低了系統的耦合度,增加了程式的可擴充套件性

其主要缺點是:

  • 代理模式會造成系統設計中類的數量增加
  • 在客戶端和目標物件之間增加一個代理物件,會造成請求處理速度變慢;
  • 增加了系統的複雜度;

模式的結構

代理模式的主要角色如下。

  1. 抽象主題(Subject)類:通過介面或抽象類宣告真實主題和代理物件實現的業務方法。
  2. 真實主題(Real Subject)類:實現了抽象主題中的具體業務,是代理物件所代表的真實物件,是最終要引用的物件。
  3. 代理(Proxy)類:提供了與真實主題相同的介面,其內部含有對真實主題的引用,它可以訪問、控制或擴充套件真實主題的功能。

代理模式的結構如下所示:

根據代理的建立時期,代理模式分為靜態代理和動態代理。

  • 靜態:由程式設計師建立代理類或特定工具自動生成原始碼再對其編譯,在程式執行前代理類的 .class 檔案就已經存在了。
  • 動態:在程式執行時,運用反射機制動態建立而成。

模式的實現

代理模式的例項程式碼如下:

(1) 首先定義抽象主題

// 抽象主題
public interface Subject {
    void request();
}

(2) 真實主題和代理類都實現同一個介面,抽象主題

// 真實主題
public class RealSubject implements Subject{
    @Override
    public void request() {
        System.out.println("訪問真實主題方法...");
    }
}

// 代理類
public class Proxy implements Subject{
    private RealSubject realSubject;
    @Override
    public void request() {
        if (realSubject == null){
            realSubject = new RealSubject();
        }
        preRequest();
        realSubject.request();
        postRequest();
    }

    public void preRequest() {
        System.out.println("訪問真實主題之前的預處理。");
    }
    public void postRequest() {
        System.out.println("訪問真實主題之後的後續處理。");
    }
}

(3) 測試類程式碼如下

public class Main {
    public static void main(String[] args) {
        Subject subject = new Proxy();
        subject.request();
    }
}

輸出結果如下:

訪問真實主題之前的預處理。
訪問真實主題方法...
訪問真實主題之後的後續處理。

靜態代理和動態代理的內容在javaSe中已經有整理過參考:03、Java進階--代理模式