Yazılım geliştirmede, nesnelerin işlevselliğini dinamik olarak genişletmek ve sınırlamalarını aşmak önemlidir. Decorator Design Pattern, bu amaçla kullanılan ve nesnelere yeni davranışlar eklemenizi sağlayan bir tasarım desenidir. Bu yazıda, Decorator Design Pattern'i adım adım açıklayacak ve nasıl kullanıldığını örneklerle göstermeye çalışacağım.
Decorator Design Pattern, nesnelere dinamik olarak davranışlar eklemenize olanak sağlar. Bu desen, bir nesneyi sarmalayan ve yeni işlevselliği ekleyen dekoratör sınıfların kullanımını içerir. Temel nesnenin işlevselliğini değiştirmeden yeni işlevsellikler ekleyebilirsiniz.
Decorator Design Pattern genellikle aşağıdaki bileşenleri içerir:
Şimdi bir örnek üzerinden Decorator Design Pattern'in nasıl uygulandığını görelim. Örneğimizde bir kahve uygulaması oluşturacağız ve kahvelere isteğe bağlı malzemeler ekleyerek fiyatlarını hesaplayacağız.
// Bileşen arayüzü
interface Coffee {
public function getDescription();
public function getCost();
}
// Somut Bileşen sınıfı
class SimpleCoffee implements Coffee {
public function getDescription() {
return "Sade Kahve";
}
public function getCost() {
return 10;
}
}
// Dekoratör sınıfı
abstract class CoffeeDecorator implements Coffee {
protected $coffee;
public function __construct(Coffee $coffee) {
$this->coffee = $coffee;
}
public function getDescription() {
return $this->coffee->getDescription();
}
public function getCost() {
return $this->coffee->getCost();
}
}
// Somut Dekoratör sınıfları
class MilkDecorator extends CoffeeDecorator {
public function getDescription() {
return parent::getDescription() . ", Süt";
}
public function getCost() {
return parent::getCost() + 5;
}
}
class SugarDecorator extends CoffeeDecorator {
public function getDescription() {
return parent::getDescription() . ", Şeker";
}
public function getCost() {
return parent::getCost() + 2;
}
}
Şimdi Decorator Design Pattern'i kullanarak kahvelere malzemeler ekleyelim.
// Kullanım örneği
$simpleCoffee = new SimpleCoffee();
echo $simpleCoffee->getDescription() . " - $" . $simpleCoffee->getCost() . "\n";
$milkCoffee = new MilkDecorator($simpleCoffee);
echo $milkCoffee->getDescription() . " - $" . $milkCoffee->getCost() . "\n";
$sugarCoffee = new SugarDecorator($simpleCoffee);
echo $sugarCoffee->getDescription() . " - $" . $sugarCoffee->getCost() . "\n";
$milkAndSugarCoffee = new MilkDecorator($sugarCoffee);
echo $milkAndSugarCoffee->getDescription() . " - $" . $milkAndSugarCoffee->getCost() . "\n";
Decorator Design Pattern, nesnelere süslemeler (dekorasyonlar) eklemek için kullanılır ve nesnelerin davranışını dinamik olarak genişletir veya değiştirir. Örneklendirme yoluyla Decorator Design Pattern'in nasıl uygulandığını ve bir kahve uygulaması üzerinde nasıl kullanılabileceğini gösterdim. Decorator Design Pattern, kodun daha esnek, genişletilebilir ve sürdürülebilir olmasını sağlar ve nesnelerin farklı kombinasyonlarını kolayca oluşturmanıza imkan tanır.