Giriş

Bir sınıfın davranışını dinamik olarak genişletmek istiyorsanız, alt sınıflarla kalıtımı çoğaltmak yerine Decorator Pattern kullanarak mevcut nesneye ek sorumluluklar ekleyebilirsiniz.
Örneğin; bir loglama servisine Caching, Retry veya Validation gibi ek fonksiyonlar eklemek için ideal bir çözümdür.


1. Decorator Pattern Temel Kavramları

  • Component: Temel arayüz veya soyut sınıf.

  • ConcreteComponent: Asıl işlevi yerine getiren sınıf.

  • Decorator: Component’i implement eden ve bir Component referansı tutan soyut sınıf.

  • ConcreteDecorator: Ek davranışları uygulayan sınıflar.


2. Kod Örneği

A. Component Arayüzü

public interface IMessage
{
    void Send(string content);
}

B. ConcreteComponent

public class EmailMessage : IMessage
{
    public void Send(string content)
    {
        Console.WriteLine($"Email gönderildi: {content}");
    }
}

C. Base Decorator

public abstract class MessageDecorator : IMessage
{
    protected readonly IMessage _inner;
    protected MessageDecorator(IMessage inner) => _inner = inner;

    public virtual void Send(string content)
    {
        _inner.Send(content);
    }
}

D. ConcreteDecorator’lar

public class LoggingDecorator : MessageDecorator
{
    public LoggingDecorator(IMessage inner) : base(inner) { }

    public override void Send(string content)
    {
        Console.WriteLine($"[Log] Mesaj gönderiliyor: {content}");
        base.Send(content);
    }
}

public class EncryptionDecorator : MessageDecorator
{
    public EncryptionDecorator(IMessage inner) : base(inner) { }

    public override void Send(string content)
    {
        var encrypted = Convert.ToBase64String(Encoding.UTF8.GetBytes(content));
        Console.WriteLine($"[Encrypt] Şifrelenmiş içerik: {encrypted}");
        base.Send(encrypted);
    }
}

E. Kullanım

IMessage email = new EmailMessage();
IMessage loggedEmail = new LoggingDecorator(email);
IMessage secureLoggedEmail = new EncryptionDecorator(loggedEmail);

secureLoggedEmail.Send("Merhaba Dünya");
// Output:
// [Encrypt] Şifrelenmiş içerik: TXVyYWJoYSBEdW55YQ==
// [Log] Mesaj gönderiliyor: TXVyYWJoYSBEdW55YQ==
// Email gönderildi: TXVyYWJoYSBEdW55YQ==

3. Katmanlı Mimari Entegrasyonu

Katman Rol
Application IMessage, EmailMessage, MessageDecorator sınıfları
Infrastructure LoggingDecorator, EncryptionDecorator
API/UI Decorator zincirini oluşturan yapılandırma kodu

4. Avantajlar & Dezavantajlar

Avantajlar

  • Esnek Genişletme: İstenilen sayıda decorator ekleyebilirsiniz.

  • Ayrı Sorumluluk: Logging, Encryption gibi davranışlar ayrı sınıflarda.

  • Dinamik Zincir: Çalışma zamanında decorator’ları değiştirebilirsiniz.

Dezavantajlar

  • Çoklu Katman: Derin decorator zinciri kodu izlemeyi zorlaştırabilir.

  • Konfigürasyon Maliyeti: Client’ın dekoratörleri sıralı şekilde oluşturması gerekir.


İleri Okuma ve Kaynaklar


5. Sonuç

Decorator Pattern ile:

  • Mevcut nesneleri bozmadan yeni davranışlar ekleyin.

  • Katmanlı mimaride sorumlulukları net ayırın.

  • Dinamik ve test edilebilir bir genişletme altyapısı oluşturun.

By tanju.bozok

Software Architect, Developer, and Entrepreneur

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir