Yani sınıfı değiştirmeden, onu sarmalayarak (wrap) yeni işlevler kazandırırız.
Bu desen, özellikle katmanlı sistemlerde ya da bir işleme farklı davranışlar dinamik olarak eklemek istediğimizde kullanılır.
Neden Kullanılır?
-
Sınıfın içeriğini değiştirmeden işlevini genişletmek için
-
Kalıtım yerine bileşen kullanarak daha esnek kodlama yapmak için
-
Her ihtiyaca özel sınıf türetmek yerine, birleştirilebilir sınıflar yaratmak için
Gerçek Hayatta Kullanım Örnekleri
-
Laravel'de middleware sistemi (her request katman katman işlenir)
-
Logging sistemleri (veriye önce dosya logu, sonra veritabanı logu eklenebilir)
-
Online sipariş sistemleri (ürüne ekstra sos, boyut, vb. eklentiler)
-
HTML render işlemleri (bir metni bold, italic, underline gibi süslemek)
<?php
interface Coffee {
public function cost(): int;
public function description(): string;
}
<?php
class BasicCoffee implements Coffee {
public function cost(): int {
return 10;
}
public function description(): string {
return "Sade Kahve";
}
}
<?php
abstract class CoffeeDecorator implements Coffee {
protected $coffee;
public function __construct(Coffee $coffee) {
$this->coffee = $coffee;
}
}
<?php
class MilkDecorator extends CoffeeDecorator {
public function cost(): int {
return $this->coffee->cost() + 3;
}
public function description(): string {
return $this->coffee->description() . ", Süt";
}
}
class SugarDecorator extends CoffeeDecorator {
public function cost(): int {
return $this->coffee->cost() + 1;
}
public function description(): string {
return $this->coffee->description() . ", Şeker";
}
}
<?php
$coffee = new BasicCoffee();
$coffee = new MilkDecorator($coffee);
$coffee = new SugarDecorator($coffee);
echo $coffee->description(); // Sade Kahve, Süt, Şeker
echo $coffee->cost(); // 14
Avantajları
-
Kod tekrarını azaltır
-
Kalıtım yerine kompozisyon kullanır
-
Yeni işlevleri eski sınıfı değiştirmeden eklemenizi sağlar
-
Dinamik olarak davranış eklenebilir (çalışma anında)
Özet
-
Decorator Pattern, kodunuzu katmanlara bölerek esnek ve sürdürülebilir hale getirir.
-
Laravel, Symfony gibi framework’lerde sıkça kullanılır.
-
Karmaşık if-else yapılarından kaçınmak için oldukça idealdir.