Sobes.tech
Middle

Decorator (Dekoratör) nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Dekoratör, nesneye dinamik olarak yeni işlevsellikler eklemeye olanak tanıyan yapısal tasarım desenidir ve nesnenin yapısını değiştirmez. Nesneyi sarmalar, aynı arayüzü sağlar ve bu sayede davranışını ekler veya değiştirir.

Ana öğeler:

  • Bileşen (Component): Sarılan nesneler ve dekoratörler için ortak işlevselliği tanımlayan arayüz veya soyut sınıf.
  • Somut Bileşen (Concrete Component): İşlevsellik eklenen temel nesne olan bileşenin uygulaması.
  • Dekoratör (Decorator): Bileşen arayüzünü uygulayan ve bir bileşen nesnesine referans içeren soyut sınıf.
  • Somut Dekoratör (Concrete Decorator): Sarılan nesne metodunu çağırmadan önce veya sonra belirli işlevsellik ekleyen dekoratör uygulaması.

Python örneği:

# Bileşen
class Coffee:
    def get_cost(self):
        return 5 # Temel kahve maliyeti
    
    def get_description(self):
        return "Basit Kahve"

# Somut Bileşen
class SimpleCoffee(Coffee):
    pass

# Dekoratör
class CoffeeDecorator(Coffee):
    def __init__(self, coffee):
        self._coffee = coffee

    def get_cost(self):
        return self._coffee.get_cost()

    def get_description(self):
        return self._coffee.get_description()

# Somut Dekoratör
class MilkDecorator(CoffeeDecorator):
    def get_cost(self):
        return self._coffee.get_cost() + 2 # Sütün maliyetini ekle

    def get_description(self):
        return self._coffee.get_description() + ", Süt"

# Kullanım
# simple_coffee = SimpleCoffee()
# print(f"Maliyet: {simple_coffee.get_cost()}, Açıklama: {simple_coffee.get_description()}")

# sütlü_kahve = MilkDecorator(simple_coffee)
# print(f"Maliyet: {sütlü_kahve.get_cost()}, Açıklama: {sütlü_kahve.get_description()}")

Avantajlar:

  • Esneklik: İşlevsellik çalışma zamanında eklenebilir.
  • Alt sınıflardan kaçınma: Her davranış kombinasyonu için çok sayıda alt sınıf oluşturmak önlenir.
  • Sorumlulukların ayrılması: Her davranış eklemesi ayrı bir sınıfta yapılır.

Dezavantajlar:

  • Sınıf sayısını artırabilir.
  • Hata ayıklama, sarmalayıcıların zinciri nedeniyle daha karmaşık hale gelebilir.