軟體系統中,物件常因網路、安全、效能等障礙無法直接存取目標物件。代理模式在客戶端與目標間引入中間層,由代理物件代理一切操作,隱藏複雜度並提供額外控制。
意圖:為其他物件提供代理以控制存取。(GoF)
結構圖:

支票/存摺是銀行帳戶資金的代理,市場交易中代替現金流通,提供對帳戶資金的存取控制:

public class Math {
public double Add(double x, double y) => x + y;
public double Sub(double x, double y) => x - y;
public double Mul(double x, double y) => x * y;
public double Div(double x, double y) => x / y;
}
若 Math 部署於遠端伺服器,客戶端需處理網路通訊、序列化/反序列化、錯誤處理等雜事:

本地 MathProxy 封裝網路通訊細節,客戶端如呼叫本地物件:

public class MathProxy {
private Math _math = new Math(); // 實際為遠程通訊邏輯
public double Add(double x, double y) => _math.Add(x, y);
public double Sub(double x, double y) => _math.Sub(x, y);
public double Mul(double x, double y) => _math.Mul(x, y);
public double Div(double x, double y) => _math.Div(x, y);
}
為確保代理與目標介面一致並強制實作所有方法,雙方實作 IMath 介面:

public interface IMath {
double Add(double x, double y);
double Sub(double x, double y);
double Mul(double x, double y);
double Div(double x, double y);
}
public class Math : IMath { ... }
public class MathProxy : IMath { ... }
// 用戶端透明使用
var proxy = new MathProxy();
var result = proxy.Add(2, 3);
| 類型 | 用途 | 核心效益 |
|---|---|---|
| 遠程代理 | 不同位址空間物件的本地代表 | 隱藏網路細節,客戶端視同本地呼叫 |
| 虛擬代理 | 按需建立資源消耗大的物件 | 延遲載入,優化啟動效能 |
| Copy-on-Write 代理 | 虛擬代理變體,延遲複製 | 必要時才真正複製物件 |
| 保護代理 | 控制存取權限 | 執行期權限檢查,決定是否轉發 |
| 快取代理 | 暫存運算結果供多客戶共享 | 減少重複計算,提升效能 |
| 防火牆代理 | 阻擋惡意存取 | 保護目標物件安全 |
| 同步化代理 | 多用戶並發存取同一物件 | 協調並發,避免衝突 |
| 智慧參考代理 | 存取時附加操作 (計數、日誌等) | 透明擴充行為 |
「增加一個中間層」是軟體解決複雜問題的常見手法,代理模式提供了豐富的變體應對不同存取控制與障礙場景,是系統架構設計中不可或缺的利器。