برنامه نویسی
الگوهای طراحی: دکوراتور – جامعه 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