ChiYu Code Journey

哈囉各位朋友~今天我們要介紹的是很實用且日常生活也常碰到的 代理模式(Proxy)

🌟 代理模式是什麼?

代理模式提供一個中介物件來控制對某個目標物件的存取,藉此加入額外行為或保護原本的物件。 就像看醫生必須先掛號一樣,櫃檯人員就是代理,他負責管理你與醫生之間的互動。


🤔 什麼情況適合用代理模式?


🛂 C# 代理模式範例

這裡以「檔案存取權限控制」為例,示範代理模式的實作。

📂 定義共通介面

/// <summary>
/// 檔案介面
/// </summary>
public interface IFile
{
    /// <summary>
    /// 顯示檔案內容
    /// </summary>
    void Display();
}

📄 建立具體物件類別

using System;

/// <summary>
/// 真實存取檔案的類別
/// </summary>
public class RealFile : IFile
{
    private readonly string _fileName;

    public RealFile(string fileName)
    {
        _fileName = fileName;
        LoadFromDisk(fileName);
    }

    /// <summary>
    /// 顯示檔案
    /// </summary>
    public void Display()
    {
        Console.WriteLine($"顯示檔案:{_fileName}");
    }

    private void LoadFromDisk(string fileName)
    {
        Console.WriteLine($"從磁碟載入檔案:{fileName}");
    }
}

🔐 建立代理類別

using System;

/// <summary>
/// 檔案存取代理
/// </summary>
public class ProxyFile : IFile
{
    private RealFile _realFile;
    private readonly string _fileName;
    private readonly bool _hasPermission;

    public ProxyFile(string fileName, bool hasPermission)
    {
        _fileName = fileName;
        _hasPermission = hasPermission;
    }

    /// <summary>
    /// 依權限決定是否顯示檔案
    /// </summary>
    public void Display()
    {
        if (_hasPermission)
        {
            _realFile ??= new RealFile(_fileName);
            _realFile.Display();
        }
        else
        {
            Console.WriteLine("您沒有存取此檔案的權限。");
        }
    }
}

🚀 實際使用範例

using System;

class Program
{
    static void Main(string[] args)
    {
        // 有權限存取
        IFile fileWithPermission = new ProxyFile("secret.docx", true);
        fileWithPermission.Display();

        Console.WriteLine();

        // 無權限存取
        IFile fileWithoutPermission = new ProxyFile("secret.docx", false);
        fileWithoutPermission.Display();
    }
}

🎯 執行結果

從磁碟載入檔案:secret.docx
顯示檔案:secret.docx

您沒有存取此檔案的權限。

⚠️ 代理模式使用注意事項


🎉 結語

恭喜你,又掌握了一個超實用的設計模式—代理模式(Proxy)!透過這個模式,我們能更安全、更有效地管理物件存取。

繼續追蹤設計模式系列吧,下篇再見囉~

代理模式:控制存取的守門員

發布於 2025年6月12日 (更新於 2025年6月12日) · 約 1 分鐘閱讀 · C# Design Patterns

哈囉各位朋友~今天我們要介紹的是很實用且日常生活也常碰到的 代理模式(Proxy)

🌟 代理模式是什麼?

代理模式提供一個中介物件來控制對某個目標物件的存取,藉此加入額外行為或保護原本的物件。 就像看醫生必須先掛號一樣,櫃檯人員就是代理,他負責管理你與醫生之間的互動。


🤔 什麼情況適合用代理模式?

  • 需要控制物件的存取權限,例如安全管理或權限限制。
  • 想延遲建立昂貴的物件實例,例如檔案或資料庫連線。
  • 想在不影響原有物件的情況下,加入額外行為(例如日誌紀錄)。

🛂 C# 代理模式範例

這裡以「檔案存取權限控制」為例,示範代理模式的實作。

📂 定義共通介面

/// <summary>
/// 檔案介面
/// </summary>
public interface IFile
{
    /// <summary>
    /// 顯示檔案內容
    /// </summary>
    void Display();
}

📄 建立具體物件類別

using System;

/// <summary>
/// 真實存取檔案的類別
/// </summary>
public class RealFile : IFile
{
    private readonly string _fileName;

    public RealFile(string fileName)
    {
        _fileName = fileName;
        LoadFromDisk(fileName);
    }

    /// <summary>
    /// 顯示檔案
    /// </summary>
    public void Display()
    {
        Console.WriteLine($"顯示檔案:{_fileName}");
    }

    private void LoadFromDisk(string fileName)
    {
        Console.WriteLine($"從磁碟載入檔案:{fileName}");
    }
}

🔐 建立代理類別

using System;

/// <summary>
/// 檔案存取代理
/// </summary>
public class ProxyFile : IFile
{
    private RealFile _realFile;
    private readonly string _fileName;
    private readonly bool _hasPermission;

    public ProxyFile(string fileName, bool hasPermission)
    {
        _fileName = fileName;
        _hasPermission = hasPermission;
    }

    /// <summary>
    /// 依權限決定是否顯示檔案
    /// </summary>
    public void Display()
    {
        if (_hasPermission)
        {
            _realFile ??= new RealFile(_fileName);
            _realFile.Display();
        }
        else
        {
            Console.WriteLine("您沒有存取此檔案的權限。");
        }
    }
}

🚀 實際使用範例

using System;

class Program
{
    static void Main(string[] args)
    {
        // 有權限存取
        IFile fileWithPermission = new ProxyFile("secret.docx", true);
        fileWithPermission.Display();

        Console.WriteLine();

        // 無權限存取
        IFile fileWithoutPermission = new ProxyFile("secret.docx", false);
        fileWithoutPermission.Display();
    }
}

🎯 執行結果

從磁碟載入檔案:secret.docx
顯示檔案:secret.docx

您沒有存取此檔案的權限。

⚠️ 代理模式使用注意事項

  • 優點:可以有效控制物件存取並加入額外行為。
  • 缺點:可能增加系統複雜度,過度使用需謹慎。

🎉 結語

恭喜你,又掌握了一個超實用的設計模式—代理模式(Proxy)!透過這個模式,我們能更安全、更有效地管理物件存取。

繼續追蹤設計模式系列吧,下篇再見囉~