| 類型 | 用途 | 核心價值 |
|---|---|---|
| 遠程代理 | 不同位址空間物件的本地代表 | 隱藏網絡通訊細節,客戶端如同呼叫本地物件 |
| 虛擬代理 | 按需創建資源消耗大的物件 | 延遲載入,優化啟動效能 |
| 保護代理 | 控制物件存取權限 | 運行時權限檢查,決定是否轉發調用 |
| 智能引用代理 | 物件引用時執行額外操作 | 引用計數、鎖定、日志記錄等 |

利用 .NET Remoting 實現不同應用程式域間的物件訪問控制。
using System;
using System.Runtime.Remoting;
// 共同介面
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);
}
// 真實主題:跑在獨立 AppDomain
class Math : MarshalByRefObject, IMath
{
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;
}
// 遠程代理:客戶端持有的本地代表
class MathProxy : IMath
{
private Math math;
public MathProxy()
{
// 在獨立 AppDomain 創建真實物件
AppDomain ad = AppDomain.CreateDomain("MathDomain", null, null);
ObjectHandle handle = ad.CreateInstance(
"Proxy_RealWorld", "Math", false,
System.Reflection.BindingFlags.CreateInstance,
null, null, null, null, null);
math = (Math)handle.Unwrap();
}
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);
}
// 客戶端測試
public class ProxyApp
{
public static void Main()
{
MathProxy p = new MathProxy();
Console.WriteLine($"4 + 2 = {p.Add(4, 2)}");
Console.WriteLine($"4 - 2 = {p.Sub(4, 2)}");
Console.WriteLine($"4 * 2 = {p.Mul(4, 2)}");
Console.WriteLine($"4 / 2 = {p.Div(4, 2)}");
}
}
MarshalByRefObject:真實物件跨域按引用封送AppDomain.CreateDomain:創建隔離執行邊界ObjectHandle.Unwrap:取得透明代理引用