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

淺析 .NET 開發中 Proxy 代理模式的實作與應用場景

     編輯:關於.NET

代理模式核心動機

當物件建構耗時、資源消耗大、遠端存取延遲高,或需控制存取權限時,**代理模式** 可延遲真實物件建立,直到真正需要時才具現化。代理與真實物件實作相同介面,客戶端透過代理間接存取真實物件。

適用場景

  1. 大型資源載入:如高解析度圖片,啟動時僅載入縮圖,真實圖片按需載入
  2. 耗時計算:計算過程中透過代理顯示中間結果
  3. 遠端物件存取:網路傳輸延遲,代理處理連線與快取
  4. 存取控制:代理驗證權限後轉發請求
  5. 初始化優化:程式啟動建立大量物件參考,但非全部立即使用

完整範例:圖片延遲載入代理

共用介面

public interface IImager
{
    Image GetImage();
}

快速載入圖片 (代理預設顯示)

public class QuickImage : IImager
{
    public Image GetImage()
    {
        return new Bitmap("Box.gif"); // 小型佔位圖
    }
}

真實圖片 (延遲載入)

public class FinalImage : IImager
{
    public Image GetImage()
    {
        return new Bitmap("flowertree.jpg"); // 大型真實圖片
    }
}

代理類別:控制載入時機

public class ImageProxy : IImager
{
    private bool _isReady = false;
    private Timer _timer;

    public ImageProxy()
    {
        // 5 秒後標記就緒 (模擬非同步載入完成)
        _timer = new Timer(Callback, this, 5000, Timeout.Infinite);
    }

    public bool IsReady() => _isReady;

    public Image GetImage()
    {
        IImager img = _isReady ? new FinalImage() : new QuickImage();
        return img.GetImage();
    }

    private void Callback(object state)
    {
        _isReady = true;
        _timer.Dispose();
    }
}

客戶端使用

public partial class Form1 : Form
{
    private ImageProxy _imgProxy;

    public Form1()
    {
        InitializeComponent();
        _imgProxy = new ImageProxy();
    }

    protected void btLoad_Click(object sender, EventArgs e)
    {
        pic.Image = _imgProxy.GetImage();
    }
}

代理模式 vs 適配器模式

比較項目代理模式適配器模式
介面與真實物件**相同**介面提供**不同**介面
目的控制存取、延遲建立、增加行為介面相容、整合不相容類別
關係代理「是一個」真實物件適配器「有」被適配物件

常見代理變體

  • 虛擬代理:延遲建立昂貴物件 (本範例)
  • 遠端代理:代表不同位址空間的物件 (WCF/Web Service)
  • 保護代理:控制存取權限
  • 智慧參考:存取時執行額外邏輯 (計數、鎖定、快取)

.NET 內建代理支援

  • System.Runtime.Remoting.Proxies.RealProxy:建立透明代理
  • WCF 通道工廠 (ChannelFactory<T>) 本質即代理
  • Lazy<T> 實現虛擬代理延遲初始化語意
  • 動態代理庫 (Castle DynamicProxy, Autofac/Unity 攔截器) 實現 AOP
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved