首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 設計模式:代理模式完整指南(四)— 代理類型全景與遠程代理實戰

     編輯:關於C語言

代理模式四大常見類型

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

遠程代理結構圖

實戰:跨 AppDomain 遠程代理

利用 .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:取得透明代理引用
  • 客戶端完全不知真實物件跑在別的 AppDomain

其他代理類型補充

  • Copy-on-Write:虛擬代理變體,延遲深度複製
  • Cache 代理:暫存運算結果供多客戶端共享
  • 防火牆代理:阻擋惡意訪問
  • 同步化代理:多執行緒安全訪問單一物件
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved