Middle
PHP'de dekoratör nasıl çalışır?
sobes.tech yapay zeka
AI'dan gelen yanıt
"Dekoratör" deseni, mevcut bir nesneye dinamik olarak yeni bir davranış ekler ve onu başka bir nesne olan dekoratör ile sarar.
-
Bileşenler:
- Arayüz (Component): Orijinal nesne ve dekoratörleri için ortak yöntemleri bildirir.
- Somut Bileşen (Concrete Component): Dekorasyon yapılacak ana nesne.
- Temel Dekoratör (Decorator): Bir arayüze (veya soyut sınıfa) sahip olup, arayüzdeki nesneye referans içerir ve genellikle çağrıyı bu nesneye devreder.
- Somut Dekoratörler (Concrete Decorators): Yeni özellikler uygular, temel bileşenin davranışını tamamlar veya değiştirir.
-
Çalışma prensibi:
- Dekoratör içerir bir referans, dekor ettiği nesneye (bileşim yoluyla).
- Aynı arayüze sahipdır, yani dekor edilen nesne ile aynı arayüzü kullanır.
- Dekoratör üzerindeki bir metod çağrıldığında, ya ek mantık önce veya sonra çağrılır veya tamamen yerine geçer (bu son kullanım tipik değildir).
-
Avantajlar:
- Nesnelere çalışma zamanında fonksiyonellik eklemeye olanak tanır, statik kalıtım yerine.
- Çok çeşitli davranışların birleşimi sırasında sınıf hiyerarşisinin patlamasını engeller.
- Esnek davranış kombinasyonları oluşturmayı sağlar.
-
Örnek:
<?php
// Bileşen arayüzü
interface Coffee {
public function getCost(): float;
public function getDescription(): string;
}
// Somut bileşen
class SimpleCoffee implements Coffee {
public function getCost(): float {
return 5.0;
}
public function getDescription(): string {
return "Basit kahve";
}
}
// Temel dekoratör
abstract class CoffeeDecorator implements Coffee {
protected Coffee $coffee;
public function __construct(Coffee $coffee) {
$this->coffee = $coffee;
}
public function getCost(): float {
return $this->coffee->getCost();
}
public function getDescription(): string {
return $this->coffee->getDescription();
}
}
// Somut dekoratör: Süt ekleme
class MilkDecorator extends CoffeeDecorator {
public function getCost(): float {
return parent::getCost() + 2.0;
}
public function getDescription(): string {
return parent::getDescription() . ", süt ile";
}
}
// Somut dekoratör: Şeker ekleme
class SugarDecorator extends CoffeeDecorator {
public function getCost(): float {
return parent::getCost() + 1.0;
}
public function getDescription(): string {
return parent::getDescription() . ", şeker ile";
}
}
// Kullanım:
// Basit kahve oluştur
$coffee = new SimpleCoffee();
echo $coffee->getDescription() . " - " . $coffee->getCost() . "\n"; // Basit kahve - 5
// Süt ekle
$coffeeWithMilk = new MilkDecorator($coffee);
echo $coffeeWithMilk->getDescription() . " - " . $coffeeWithMilk->getCost() . "\n"; // Basit kahve, süt ile - 7
// Şeker ekle
$coffeeWithMilkAndSugar = new SugarDecorator($coffeeWithMilk);
echo $coffeeWithMilkAndSugar->getDescription() . " - " . $coffeeWithMilkAndSugar->getCost() . "\n"; // Basit kahve, süt ile, şeker ile - 8