Decorator Pattern (Süsleyici Deseni), bir nesnenin işlevselliğini, onu değiştirmeden veya alt sınıflar türetmeden dinamik olarak genişletmeye olarak tanır. Bu desen, nesnelere ek sorumluluklar veya davranışlar eklemek için kullanılır. Bu işlemi yapmak için nesneleri sarar (wrap) ve ek işlevsellik sağlar.

Neden ve Nerede Kullanılır?
- Esneklik: Nesnelerin işlevselliğini dinamik olarak genişletmek için kullanılır, bu da esnek ve genişletilebilir bir yapı sağlar.
- Tekrar Kullanılabilirlik: Dekoratörler, temel sınıfı değiştirmeden farklı kombinasyonlarda tekrar kullanılabilir.
- Temiz Kod: Sınıf hiyerarşisini karmaşıklaştırmadan, işlevsellik eklemek için temiz bir yöntem sunar.
- Ayrık Sorunlar: Farklı sorumlulukları ayrı dekoratörler olarak tanımlayarak, kodun ayrık ve yönetilebilir olmasını sağlar.
Örnek Kod
// Temel sınıf
class Coffee {
cost() {
return 5;
}
}
// Dekoratör sınıfı
class MilkDecorator {
constructor(coffee) {
this.coffee = coffee;
}
cost() {
return this.coffee.cost() + 1;
}
}
class SugarDecorator {
constructor(coffee) {
this.coffee = coffee;
}
cost() {
return this.coffee.cost() + 0.5;
}
}
// Kullanım
let myCoffee = new Coffee();
console.log("Plain Coffee: $" + myCoffee.cost()); // Plain Coffee: $5
myCoffee = new MilkDecorator(myCoffee);
console.log("Coffee with Milk: $" + myCoffee.cost()); // Coffee with Milk: $6
myCoffee = new SugarDecorator(myCoffee);
console.log("Coffee with Milk and Sugar: $" + myCoffee.cost()); // Coffee with Milk and Sugar: $6.5
Açıklama
- ‘Coffee’ sınıfı, temel kahve nesnesini temsil eder ve ‘cost’ yöntemi ile fiyatını döndürür.
- ‘MilkDecorator’ ve ‘SugarDecorator’ sınıfları, dekoratör sınıflarıdır. Her biri ‘Coffee’ nesnesini sarar ve ‘cost’ yöntemini genişleterek ek maliyet ekler.
- Kullanım kısmında, temel ‘Coffee’ nesnesi oluşturulur ve ardından ‘MilkDecorator’ ve ‘SugarDecorator’ kullanılarak işlevsellik dinamik olarak genişletilir.
Özetle
Decorator Pattern, nesnelerin işlevselliğini dinamik olarak genişletmek için kullanılır. Bu desen, sınıf hiyerarşisini karmaşıklaştırmadan, nesnelere ek sorumluluklar veya davranışlar eklemeye olanak tanır. Bu sayede, esnek, temiz ve yeniden kullanılabilir kod yazmak mümkün olur. Dekorator deseninin yaygın kullanımı, kullanıcı arayüzlerinde bileşenlere stil veya davranış eklemek, nesnelerin davranışlarını dinamik olarak değiştirmek veya genişletmektir.