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

.NET 設計模式精解(十四):代理模式——增加間接層,解決存取障礙與控制需求

     編輯:關於.NET

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

一、模式意圖與結構

意圖:為其他物件提供代理以控制存取。(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 代理虛擬代理變體,延遲複製必要時才真正複製物件
保護代理控制存取權限執行期權限檢查,決定是否轉發
快取代理暫存運算結果供多客戶共享減少重複計算,提升效能
防火牆代理阻擋惡意存取保護目標物件安全
同步化代理多用戶並發存取同一物件協調並發,避免衝突
智慧參考代理存取時附加操作 (計數、日誌等)透明擴充行為

五、總結

「增加一個中間層」是軟體解決複雜問題的常見手法,代理模式提供了豐富的變體應對不同存取控制與障礙場景,是系統架構設計中不可或缺的利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved