結構性示範代碼
using System;
// 抽象主題
abstract class Subject
{
public abstract void Request();
}
// 真實主題
class RealSubject : Subject
{
public override void Request()
=> Console.WriteLine("Called RealSubject.Request()");
}
// 代理
class Proxy : Subject
{
private RealSubject realSubject;
public override void Request()
{
// 延遲初始化
if (realSubject == null)
realSubject = new RealSubject();
PreRequest();
realSubject.Request();
PostRequest();
}
private void PreRequest() => Console.WriteLine("PreRequest.");
private void PostRequest() => Console.WriteLine("PostRequest.");
}
// 客戶端
public class Client
{
public static void Main()
{
Proxy p = new Proxy();
p.Request();
}
}
執行結果
PreRequest.
Called RealSubject.Request()
PostRequest.
核心模式要素
- 介面一致:代理實作與真實主題相同介面
- 持有引用:代理內部持有真實主題引用
- 控制存取:決定何時創建、銷毀真實主題
- 預/後處理:轉發調用前後執行額外邏輯(日志、權限、快取等)
延遲初始化優勢
- 真實主題建構昂貴(大量記憶體、網絡連線、資料庫連接)
- 若從未調用
Request(),真實主題永不創建
- 首次調用時才實例化,後續複用
代理 vs 裝飾器 對比
| 維度 | 代理 | 裝飾器 |
| 目的 | 控制存取 | 動態添加職責 |
| 生命週期 | 代理通常創建/管理真實物件 | 裝飾器接收外部傳入的物件 |
| 介面 | 相同介面 | 相同介面(可擴展) |