В разработке программного обеспечения шаблон прокси действует как суррогат или заполнитель для другого объекта, контролируя доступ к нему. Шаблон прокси особенно полезен, когда мы хотим добавить к объекту дополнительные функции, такие как отложенная загрузка, контроль доступа или кэширование, не изменяя его исходную реализацию. В этой статье мы углубимся в шаблон Proxy в C#, поймем его преимущества и продемонстрируем его реализацию на практических примерах.

Что такое прокси-шаблон? Прокси-паттерн — это структурный паттерн проектирования, который создает репрезентативный объект, прокси, для замены другого объекта, реального субъекта. Прокси-объект действует как посредник между клиентом и реальным субъектом, позволяя вводить дополнительные функции, сохраняя при этом тот же интерфейс, что и реальный субъект.

Ключевые компоненты шаблона прокси:

  1. Субъект: общий интерфейс или абстрактный класс, совместно используемый как реальным субъектом, так и прокси.
  2. Реальный субъект: фактический объект, который представляет прокси-сервер и к которому контролирует доступ.
  3. Прокси: объект, который заменяет реальный субъект, перенаправляя запросы клиентов и предоставляя дополнительные функции.

Реализация шаблона прокси на C#: Давайте проиллюстрируем шаблон прокси на простом примере. Предположим, у нас есть интерфейс Image, представляющий изображение, и класс RealImage, представляющий фактический файл изображения. Мы создадим класс ProxyImage, который действует как прокси для реального изображения и добавляет функциональность для ленивой загрузки реального изображения.

using System;

// Step 1: Subject interface
public interface IImage
{
    void Display();
}

// Step 2: Real Subject class
public class RealImage : IImage
{
    private string fileName;

    public RealImage(string fileName)
    {
        this.fileName = fileName;
        LoadImageFromDisk();
    }

    public void Display()
    {
        Console.WriteLine($"Displaying {fileName}");
    }

    private void LoadImageFromDisk()
    {
        Console.WriteLine($"Loading {fileName} from disk");
    }
}

// Step 3: Proxy class
public class ProxyImage : IImage
{
    private RealImage realImage;
    private string fileName;

    public ProxyImage(string fileName)
    {
        this.fileName = fileName;
    }

    public void Display()
    {
        if (realImage == null)
        {
            realImage = new RealImage(fileName);
        }
        realImage.Display();
    }
}

// Step 4: Client code using the Proxy
class Program
{
    static void Main()
    {
        // Client code interacts with the proxy, not directly with the real image
        IImage image = new ProxyImage("example.jpg");

        // The real image is only loaded when needed
        image.Display(); // Output: Loading example.jpg from disk, Displaying example.jpg
        image.Display(); // Output: Displaying example.jpg (no loading as the real image is already loaded)
    }
}

Вывод: шаблон прокси — это мощный инструмент для управления доступом к объектам и добавления дополнительных функций без изменения их исходных реализаций. Создавая прокси-объекты, имитирующие реальные предметы, разработчики могут повысить производительность, безопасность и эффективность своих приложений. Шаблон прокси особенно полезен при работе с ресурсоемкими объектами, такими как большие изображения или соединения с базой данных.

В этой статье мы рассмотрели шаблон Proxy в C#, поняли его основные принципы и продемонстрировали его реализацию на практическом примере. Освоив шаблон Proxy, разработчики могут создать более модульную и удобную в сопровождении кодовую базу, обеспечив при этом эффективное управление объектами.

Удачного кодирования!