代理模式

📢 本文由 gemini-3-flash-preview 翻譯

Proxy Pattern 物件結構型模式

意圖

為其他物件提供一種代理以控制對這個物件的存取。

結構

代理模式

其中:

  • Proxy 保存一個參照使得代理可以存取實體;提供一個與 Subject 的介面相同的介面,使代理可以用來代替實體;控制對實體的存取,並可能負責建立和刪除它。
  • Subject 定義 RealSubject 和 Proxy 的共用介面,這樣就在任何使用 RealSubject 的地方都可以使用 Proxy。
  • RealSubject 定義 Proxy 所代表的實體。

適用性

Proxy 模式適用於在需要比較通用和複雜的物件指標代替簡單指標的時候,常見的情況有:

  • 遠端代理 (Remote Proxy) 為一個物件在不同位址空間提供區域代表。
  • 虛擬代理 (Virtual Proxy) 根據需要對原始物件進行存取,用於物件應該有不同的存取權限時。
  • 保護代理 (Protection Proxy) 控制對原始物件的存取,用於物件應該有不同的存取權限時。
  • 智慧型參照 (Smart Reference) 取代了簡單的指標,它在存取物件時執行了一些附加操作。典型用途包括:對指向實際物件的參照計數,這樣當該物件沒有參照時,可以被自動釋放;當第一次參照一個永續物件時,將它裝入記憶體;在存取一個實際物件前,檢查是否已經鎖定了它,以確保其他物件不能改變它。

範例

仲介代理買東西

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class ProxyPattern {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        Proxy proxy = new Proxy(realSubject);

        proxy.buy();
    }
}

interface Subject{
    public void buy();
}

class Proxy implements Subject{
    protected RealSubject realSubject;

    public Proxy(RealSubject realSubject){
        this.realSubject = realSubject;
    }

    @Override
    public void buy() {
        System.out.println("prepare");
        realSubject.buy();
        System.out.println("complete");
    }
}

class RealSubject implements Subject{

    @Override
    public void buy() {
        System.out.println("Money");
    }
}