În proiectarea software-ului, modelul proxy acționează ca un surogat sau substituent pentru un alt obiect, controlând accesul la acesta. Modelul Proxy este deosebit de util atunci când dorim să adăugăm funcționalități suplimentare unui obiect, cum ar fi încărcarea leneșă, controlul accesului sau stocarea în cache, fără a modifica implementarea sa inițială. În acest articol, vom aprofunda în modelul proxy în C#, vom înțelege beneficiile acestuia și vom demonstra implementarea acestuia cu exemple practice.

Ce este modelul proxy? Modelul Proxy este un model de design structural care creează un obiect reprezentativ, proxy, pentru a înlocui un alt obiect, subiectul real. Obiectul proxy acționează ca un intermediar între client și subiectul real, permițând introducerea de funcționalități suplimentare menținând în același timp aceeași interfață ca subiectul real.

Componentele cheie ale modelului proxy:

  1. Subiect: interfața comună sau clasa abstractă partajată atât de subiectul real, cât și de proxy.
  2. Subiect real: obiectul real pe care proxy-ul îl reprezintă și la care controlează accesul.
  3. Proxy: Obiectul care acționează ca un substitut pentru subiectul real, redirecționând cererile clienților și oferind funcționalități suplimentare.

Implementarea modelului proxy în C#: Să ilustrăm modelul proxy cu un exemplu simplu. Să presupunem că avem o interfață Image care reprezintă o imagine și o clasă RealImage care reprezintă fișierul imagine real. Vom crea o clasă ProxyImage care acționează ca un proxy pentru imaginea reală și adaugă funcționalitate pentru a încărca leneș imaginea reală.

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)
    }
}

Concluzie: Modelul Proxy este un instrument puternic pentru controlul accesului la obiecte și pentru adăugarea de funcționalități suplimentare fără a modifica implementările lor originale. Prin crearea de obiecte proxy care imită subiectele reale, dezvoltatorii pot îmbunătăți performanța, securitatea și eficiența aplicațiilor lor. Modelul proxy este deosebit de util atunci când aveți de-a face cu obiecte care necesită mult resurse, cum ar fi imagini mari sau conexiuni la baze de date.

În acest articol, am explorat modelul proxy în C#, am înțeles principiile sale de bază și am demonstrat implementarea acestuia printr-un exemplu practic. Prin stăpânirea modelului proxy, dezvoltatorii pot realiza o bază de cod mai modulară și mai ușor de întreținut, asigurând în același timp un management eficient al obiectelor.

Codare fericită!