برنامه نویسی

الگوهای طراحی: دکوراتور – جامعه Dev

الگوی دکوراتور یک الگوی طراحی ساختاری است که اجازه می دهد بدون تغییر کد آنها ، رفتار به صورت پویا به اشیاء فردی اضافه شود. اغلب برای گسترش ویژگی های کلاس ها به روشی انعطاف پذیر و قابل استفاده مجدد استفاده می شود.

چه موقع از آن استفاده کنید؟

  • شما باید در زمان اجرا رفتار را به صورت پویا اضافه کنید. مثال: یک برنامه کافی شاپ که در آن کاربران می توانند نوشیدنی های خود را با افزودنی هایی مانند شیر ، شکر ، خامه شلاق و غیره سفارشی کنند.
  • شما می خواهید از یک درخت وراثت بزرگ جلوگیری کنید. اگر از وراثت استفاده می کنید ، هر ترکیبی از رفتارها به یک زیر کلاس جدید نیاز دارد (به عنوان مثال ، CoffeeWithMilkبا CoffeeWithSugarبا CoffeeWithMilkAndSugar، و غیره).
  • شما می خواهید کد انعطاف پذیر تر و قابل استفاده مجدد داشته باشید. دکوراسیون های مختلف را می توان به طور مستقل مورد استفاده مجدد قرار داد. مثال: می توان از یک LoggingDecorator ، CompressionDecorator و EncryptionDecorator استفاده کرد.
  • شما اصل بسته را دنبال می کنید. به جای اصلاح یک کلاس موجود ، می توانید با استفاده از دکوراتورها رفتار را گسترش دهید. این باعث می شود کد شما قابل حفظ تر باشد.
  • شما باید چندین رفتار مستقل را با هم ترکیب کنید. مثال: یک ویرایشگر متن که در آن می توانید بدون اصلاح کلاس پایه ، جسورانه ، ایتالیایی و زیر خط را اعمال کنید.

چه موقع از آن استفاده نکنید؟

  • رفتار شیء در زمان اجرا تغییر نمی کند. اگر رفتار یک شیء ثابت باشد و نیازی به تغییر پویا نداشته باشد.
  • تعداد ترکیبات احتمالی اندک است
  • الگوهای جایگزین ساده تر است. اگر به رفتارهای متفاوتی احتیاج دارید اما به انباشت نیاز ندارید ، الگوی استراتژی ممکن است انتخاب بهتری باشد. اگر چند پیکربندی شناخته شده دارید ، ممکن است یک کارخانه قابل حفظ تر باشد.

مثال در C#

رابط

public interface ICoffee
{
    string GetDescription();
    double GetCost();
}


حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اجرای مؤلفه بتونی

public class SimpleCoffee : ICoffee
{
    public string GetDescription()
    {
        return "Simple Coffee";
    }

    public double GetCost()
    {
        return 5.0; // Base price of coffee
    }
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

دکوراتور انتزاعی

public abstract class CoffeeDecorator : ICoffee
{
    protected ICoffee _coffee;

    public CoffeeDecorator(ICoffee coffee)
    {
        _coffee = coffee;
    }

    public virtual string GetDescription()
    {
        return _coffee.GetDescription();
    }

    public virtual double GetCost()
    {
        return _coffee.GetCost();
    }
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

دکوراسیون های بتونی

public class MilkDecorator : CoffeeDecorator
{
    public MilkDecorator(ICoffee coffee) : base(coffee) { }

    public override string GetDescription()
    {
        return _coffee.GetDescription() + ", Milk";
    }

    public override double GetCost()
    {
        return _coffee.GetCost() + 1.5; // Extra cost for milk
    }
}

public class SugarDecorator : CoffeeDecorator
{
    public SugarDecorator(ICoffee coffee) : base(coffee) { }

    public override string GetDescription()
    {
        return _coffee.GetDescription() + ", Sugar";
    }

    public override double GetCost()
    {
        return _coffee.GetCost() + 0.5; // Extra cost for sugar
    }
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

مشتری

class Program
{
    static void Main()
    {
        // Create a simple coffee
        ICoffee coffee = new SimpleCoffee();
        Console.WriteLine($"{coffee.GetDescription()} - ${coffee.GetCost()}");

        // Add milk to the coffee
        coffee = new MilkDecorator(coffee);
        Console.WriteLine($"{coffee.GetDescription()} - ${coffee.GetCost()}");

        // Add sugar to the coffee
        coffee = new SugarDecorator(coffee);
        Console.WriteLine($"{coffee.GetDescription()} - ${coffee.GetCost()}");
    }
}

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

پایان

الگوی دکوراتور ابزاری عالی برای گسترش عملکرد به صورت پویا در حالی که کد پایه را تمیز و مدولار نگه می دارد. این ماده به طور گسترده ای در چارچوب هسته .NET و کتابخانه های آن برای ارائه قابلیت انعطاف پذیر و قابل انعطاف استفاده می شود. برخی از کاربردها عبارتند از:

  • خط لوله واسطه ، app.usemiddleware ()
  • ورود به سیستمبا ILogger با چندین ارائه دهنده (Consoleبا Debug، و غیره)
  • ذخیره سازیبا IMemoryCacheبا IDistributedCache

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا