Dasturiy ta'minotni loyihalashda proksi shablon boshqa ob'ekt uchun o'rinbosar yoki to'ldiruvchi vazifasini bajaradi va unga kirishni nazorat qiladi. Proksi-server namunasi, ayniqsa, ob'ektga qo'shimcha funktsiyalarni, masalan, dangasa yuklash, kirishni boshqarish yoki keshlash, uning asl bajarilishini o'zgartirmasdan qo'shishni xohlaganimizda foydalidir. Ushbu maqolada biz C# tilidagi Proksi shablonini ko'rib chiqamiz, uning afzalliklarini tushunamiz va amaliy misollar bilan uni amalga oshirishni ko'rsatamiz.

Proksi namunasi nima? Proksi-server namunasi boshqa ob'ekt, haqiqiy sub'ektning o'rnida turish uchun vakili ob'ektni, proksi-serverni yaratadigan tizimli dizayn namunasidir. Proksi-ob'ekt mijoz va haqiqiy sub'ekt o'rtasida vositachi bo'lib, haqiqiy sub'ekt bilan bir xil interfeysni saqlab qolgan holda qo'shimcha funktsiyalarni joriy qilish imkonini beradi.

Proksi-serverning asosiy komponentlari:

  1. Mavzu: Haqiqiy mavzu va proksi-server tomonidan umumiy interfeys yoki mavhum sinf.
  2. Haqiqiy mavzu: proksi-server taqdim etadigan va kirishni boshqaradigan haqiqiy ob'ekt.
  3. Proksi-server: real sub'ekt o'rnini bosuvchi, mijoz so'rovlarini yo'naltiruvchi va qo'shimcha funktsiyalarni ta'minlovchi ob'ekt.

C# da proksi shablonini amalga oshirish: oddiy misol bilan proksi shablonini ko'rsatamiz. Aytaylik, bizda tasvirni ifodalovchi Image interfeysi va haqiqiy tasvir faylini ifodalovchi RealImage klassi bor. Biz haqiqiy tasvirga proksi-server vazifasini bajaradigan va haqiqiy tasvirni dangasalik bilan yuklash funksiyasini qo'shadigan ProxyImage sinfini yaratamiz.

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

Xulosa: Proksi-server namunasi ob'ektlarga kirishni boshqarish va ularning asl ilovalarini o'zgartirmasdan qo'shimcha funktsiyalarni qo'shish uchun kuchli vositadir. Haqiqiy sub'ektlarni taqlid qiluvchi proksi-ob'ektlarni yaratish orqali ishlab chiquvchilar o'z ilovalarining ishlashi, xavfsizligi va samaradorligini oshirishlari mumkin. Proksi namunasi, ayniqsa, katta tasvirlar yoki ma'lumotlar bazasi ulanishlari kabi resurs talab qiladigan ob'ektlar bilan ishlashda foydalidir.

Ushbu maqolada biz C# tilidagi proksi-server namunasini ko'rib chiqdik, uning asosiy tamoyillarini tushundik va amaliy misol orqali uni amalga oshirishni ko'rsatdik. Proksi-server shablonini o'zlashtirib, ishlab chiquvchilar ob'ektni samarali boshqarishni ta'minlab, yanada modulli va barqaror kodlar bazasiga erishishlari mumkin.

Baxtli kodlash!