Sobes.tech
Middle

Programlama bağlamında dekoratör (Decorator) nedir ve nasıl kullanılır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Dekoratör, yapısal tasarım desenlerinden biridir ve nesnelerin yapılarını değiştirmeden yeni davranışlar veya sorumluluklar eklemeye olanak tanır.

Ana fikirler:

  • Var olan bir nesneyi sarmalar ve işlevselliğini genişletir.
  • Sarılan nesnenin arayüzünü korur ve yer değiştirebilirliği sağlar.
  • Yeni davranış kombinasyonları eklerken sınıf hiyerarşisinin büyümesini engeller.

Kullanım:

  1. "Çalışma zamanında" işlevselliğin genişletilmesi: Program çalışırken nesnenin davranışını eklemek veya değiştirmek gerektiğinde kullanılır.
  2. Miras yerine: Her davranış kombinasyonu için alt sınıflar oluşturmak yerine dekoratörler kullanılır. Bu daha esnek bir yaklaşımdır.
  3. Davranışların kombinasyonu: Farklı dekoratörler aynı nesneye farklı sıralarda uygulanabilir ve benzersiz kombinasyonlar oluşturabilir.

Python örneği:

# Temel bileşen
class Component:
    def operation(self):
        pass

# Somut bileşen
class ConcreteComponent(Component):
    def operation(self):
        return "ConcreteComponent"

# Temel dekoratör (sarmalanan nesneye referans tutar)
class Decorator(Component):
    def __init__(self, component):
        self._component = component

    def operation(self):
        return self._component.operation()

# Somut dekoratör A
class ConcreteDecoratorA(Decorator):
    def operation(self):
        return f"ConcreteDecoratorA({self._component.operation()})"

# Somut dekoratör B
class ConcreteDecoratorB(Decorator):
    def operation(self):
        return f"ConcreteDecoratorB({self._component.operation()})"

# Kullanım
simple = ConcreteComponent()
print(simple.operation())  # ConcreteComponent

decorated_a = ConcreteDecoratorA(simple)
print(decorated_a.operation()) # ConcreteDecoratorA(ConcreteComponent)

decorated_b_a = ConcreteDecoratorB(decorated_a)
print(decorated_b_a.operation()) # ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))

Python'da sözdizimi şekerleri @ ile örneği:

def my_decorator(func):
    def wrapper():
        print("Fonksiyondan önce")
        func()
        print("Fonksiyondan sonra")
    return wrapper

@my_decorator
def say_hello():
    print("Merhaba!")

say_hello()
# Çıktı:
# Fonksiyondan önce
# Merhaba!
# Fonksiyondan sonra