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 birComponentreferansı 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.