Decorator Tasarım Deseni

Herkese merhaba, C# yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda decorator tasarım desenini anlatacağım. Hadi başlayalım !
İçerik Detayları
Decorator Tasarım Deseni Nedir?
Decorator tasarım deseni, nesne yönelimli programlama (OOP) prensiplerine dayanan bir tasarım desenidir. Bu desen, bir nesnenin işlevselliğini dinamik olarak genişletmek için kullanılır. Bu desen, Open/Closed prensibini (yani, bir sınıfın değiştirilmesi yerine ona ek işlevsellik eklenmesi) takip eder.
Bu tasarım deseni, var olan bir sınıfı genişletmek için bir ara sınıf eklemek yerine, var olan sınıfın işlevselliğini bir dekoratör sınıfı kullanarak genişletir. Bu dekoratör sınıfı, ek işlevselliği sağlamak için var olan sınıfı sarmalar.
Örneğin, bir web sitesi tasarımı yaparken, bir HTML elemanının işlevselliğini dinamik olarak genişletmek isteyebilirsiniz. Bu durumda, var olan HTML elemanı sınıfını değiştirmek yerine, bir dekoratör sınıfı kullanarak elemanın işlevselliğini genişletebilirsiniz. Bu dekoratör sınıfı, var olan elemanı sarmalayarak, yeni işlevselliği sağlar.
Decorator Tasarım Deseni Kullanımı
Decorator tasarım deseni, özellikle aşağıdaki durumlarda kullanışlıdır:
- Bir nesnenin işlevselliğini dinamik olarak genişletmek istediğinizde.
- Sınıfları değiştirmeden var olan kodu genişletmek istediğinizde.
- Bir nesnenin farklı sürümlerinin olduğu ve bunların hepsinin benzer işlevselliğe sahip olduğu durumlarda.
Decorator Tasarım Deseni Örneği
Aşağıda, bir C# kod örneği verilmiştir. Bu örnek, bir pizza siparişi uygulaması tasarlamak için kullanılabilir. Bu uygulamada, müşterilerin siparişlerine ekstra malzemeler ekleyebilmeleri için bir dekoratör tasarım deseni kullanılır.
// Pizza sınıfı
public abstract class Pizza
{
public abstract string GetDescription();
public abstract double CalculateCost();
}
// Pizza implementasyonu
public class PlainPizza : Pizza
{
public override string GetDescription()
{
return "Plain Pizza";
}
public override double CalculateCost()
{
return 4.00;
}
}
// Dekoratör sınıfı
public abstract class PizzaDecorator : Pizza
{
protected Pizza _pizza;
public PizzaDecorator(Pizza pizza)
{
_pizza = pizza;
}
public override string GetDescription()
{
return _pizza.GetDescription();
}
public override double CalculateCost()
{
return _pizza.CalculateCost();
}
}
// Ekstra malzeme dekoratörleri
public class Cheese : PizzaDecorator
{
public Cheese(Pizza pizza) : base(pizza)
{
}
public override string GetDescription()
{
return base.GetDescription() + ", Cheese";
}
public override double CalculateCost()
{
return base.CalculateCost() + 0.50;
}
}
public class Pepperoni : PizzaDecorator
{
public Pepperoni(Pizza pizza) : base(pizza)
{
}
public override string GetDescription()
{
return base.GetDescription() + ", Pepperoni";
}
public override double CalculateCost()
{
return base.CalculateCost() + 0.75;
}
}
// Kullanım örneği
class Program
{
static void Main(string[] args)
{
// Temel pizza siparişi
Pizza pizza = new PlainPizza();
Console.WriteLine("Description: " + pizza.GetDescription() + " Cost: " + pizza.CalculateCost().ToString("C"));
// Ekstra malzeme eklenmiş pizza siparişi
pizza = new Cheese(pizza);
pizza = new Pepperoni(pizza);
Console.WriteLine("Description: " + pizza.GetDescription() + " Cost: " + pizza.CalculateCost().ToString("C"));
}
}
Yukarıdaki kodda, `Pizza` sınıfı temel bir pizza nesnesi temsil eder. `PlainPizza` sınıfı, bu sınıftan türetilen bir pizza implementasyonudur. `PizzaDecorator` sınıfı, dekoratör sınıfını temsil eder ve `Pizza` nesnesini sarmalar. `Cheese` ve `Pepperoni` sınıfları, ekstra malzeme dekoratörleridir ve `PizzaDecorator` sınıfından türetilir.
`Main` metodu, bu tasarım deseninin kullanımını gösterir. İlk olarak, bir temel pizza siparişi oluşturulur ve `GetDescription` ve `CalculateCost` metodları kullanılarak özellikleri görüntülenir. Daha sonra, ekstra malzemeler (`Cheese` ve `Pepperoni`) eklenir ve tekrar `GetDescription` ve `CalculateCost` metodları kullanılarak sonuç görüntülenir.
Sonuç olarak, decorator tasarım deseni, C# programlama dili ile nesne yönelimli programlama konusunda daha esnek bir yaklaşım sunar. Bu tasarım deseni, var olan nesnelerin işlevselliğini dinamik olarak genişletmek için kullanılabilir ve sınıfları değiştirmeden var olan kodu genişletmek için idealdir.
Evet decorator tasarım deseni özellikleri ve kullanımı bu şekilde olmakta. Tüm C# yazılarımıza buraya, tasarım desenlerine buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.