Decorator deseni nedir? Kalıtıma göre avantajı nedir? Bir örnekle gösterin.

Cevap

Decorator, bir nesneye aynı arayüzü koruyarak çalışma zamanında yeni davranışlar ekleyen yapısal bir desendir. Nesne, aynı arayüzü uygulayan bir sarmalayıcıya (wrapper) konur; sarmalayıcı işi asıl nesneye devreder ve öncesinde/sonrasında ek iş yapar.

Neden kalıtım değil?

Loglama, cache ve retry özelliklerini kalıtımla eklemeye çalışırsanız her kombinasyon için ayrı alt sınıf gerekir (CachedLoggedRetryingClient...). Bu sınıf patlamasıdır. Decorator'larla bunları serbestçe zincirleyebilirsiniz.

from abc import ABC, abstractmethod
import time

class DataSource(ABC):
    @abstractmethod
    def read(self, key: str) -> str: ...

class DbSource(DataSource):
    def read(self, key):
        return f"db:{key}"

class CacheDecorator(DataSource):
    def __init__(self, inner: DataSource):
        self.inner, self.cache = inner, {}
    def read(self, key):
        if key not in self.cache:
            self.cache[key] = self.inner.read(key)
        return self.cache[key]

class TimingDecorator(DataSource):
    def __init__(self, inner: DataSource):
        self.inner = inner
    def read(self, key):
        t = time.perf_counter()
        try:
            return self.inner.read(key)
        finally:
            print(f"read({key}) {time.perf_counter() - t:.6f}s")

source = TimingDecorator(CacheDecorator(DbSource()))
source.read("user:1")

Gerçek hayattan örnekler

  • Java I/O: new BufferedReader(new InputStreamReader(new FileInputStream(f))).
  • HTTP middleware zincirleri (Express, ASP.NET Core) aynı fikrin fonksiyonel hâlidir.
  • Python'daki @decorator sözdizimi fonksiyonları sarmalar; adı ortak, mantığı aynıdır ama nesne değil fonksiyon düzeyinde çalışır.

Dezavantajları

Çok katmanlı sarmalama hata ayıklamayı zorlaştırır; decorator sırası sonucu etkileyebilir (cache'i timing'in içine mi dışına mı koyduğunuz ölçümü değiştirir).

  1. Clean code nedir? Yaygın code smell'ler nelerdir?OrtaOOP & Tasarım DesenleriYazılım Müh.
  2. Dependency Injection nedir? IoC container ne işe yarar?ZorOOP & Tasarım DesenleriYazılım Müh.
  3. Strategy deseni nedir? if/else zincirlerini nasıl ortadan kaldırır?OrtaOOP & Tasarım DesenleriYazılım Müh.
  4. Observer deseni nedir? Gerçek hayatta nerelerde karşımıza çıkar?OrtaOOP & Tasarım DesenleriYazılım Müh.
  5. Factory deseni nedir? Ne zaman kullanılır?OrtaOOP & Tasarım DesenleriYazılım Müh.
  6. Singleton deseni nedir? Neden bazen anti-pattern olarak görülür?ZorOOP & Tasarım DesenleriYazılım Müh.

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle