📢 本文由 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");
}
}
|