Programlamada Tasarım Desenleri #11 — Decorator (Süsleyici) Design Pattern Nedir? – .NET C# ile Örnek Uygulama
🔍 Anahtar Kelimeler: Decorator Design Pattern, C# Decorator Pattern, .NET Tasarım Desenleri, Structural Design Patterns, Yazılım Mimarisi, OOP Design Patterns
🎯 Giriş: Yazılımda Esneklik Arıyorsanız Decorator Deseni’ni Öğrenin!
Modern yazılım geliştirmenin en önemli öğelerinden biri genişletilebilirlik ve bırakımı kolay kod yazmaktır. Uygulamanıza yeni özellikler eklemek istiyorsanız ama mevcut kodu değiştirmek istemiyorsanız ne yaparsınız?
İşte o zaman Decorator Design Pattern yani Süsleyici Tasarım Deseni devreye girer!
Bu yazıda:
- Decorator Pattern nedir?
- Ne zaman ve neden kullanılır?
- Avantajları ve dezavantajları neler?
- .NET (C#) kullanarak gerçek dünya örneğiyle nasıl uygulanır?
- Detaylı kod örnekleri ve açıklamaları
birlikte öğreneceğiz.
Hazırsanız başlayalım! 🚀
🧱 Decorator Design Pattern Nedir?
Kategori: Structural (Yapısal) Tasarım Deseni
Tanım: Decorator Design Pattern, bir nesnenin davranışını çalıştırma zamanında (runtime) mevcut sınıfı değiştirmeden genişletmeye olanak tanır.
Bu desen ile, temel bir sınıf üzerinden farklı davranışlar türetebilir, gerektiğinde yeni yetenekler ekleyebilirsiniz.
Decorator, inheritance (kalıtım) yerine composition (içerme) yaklaşımını kullanır. Bu da yazılımsal esnekliği artırır.

🧠 Ne Zaman Kullanmalısınız?
Aşağıdaki durumlarda ideal tercihtir:
- Aynı sınıfa ait birçok farklı davranışı dinamik olarak eklemek istiyorsanız
- Runtime’da nesneye yeni özellikler kazandırmanız gerekiyorsa
- Sınıfa yeni yetenek kazandırırken, Kod tekrarından kaçmak istiyorsanız
Open/Closed Principle(Açık/Kapalı Prensibi) uygulamak istiyorsanız
🎁 Gerçek Hayattan Analog: Kahve Siparişi
Bir kahve dükkanındasınız. Bir bardak sade kahve alıyorsunuz. Sonra “süt ekleyin” diyorsunuz. Sonra belki şeker, çikolata sosu…
Aslında hep aynı temel içeceği alıyorsunuz ama üstüne kat kat süslemeler geliyor: İşte bu, tam anlamıyla Decorator Pattern‘ın ta kendisi!

👩💻 C# ile Uygulama Örneği: Bir Bildirim Sistemi
Senaryo: Uygulamanızda bir bildirim sistemi var. Başlangıçta e-postayla bildirim gönderiyorsunuz. Zamanla, SMS ve Slack bildirimlerini de eklemelisiniz.
Peki bunu nasıl esnek şekilde yaparsınız?
1️⃣ Ortak Arabirim (Interface)
public interface INotifier
{
void Send(string message);
}
2️⃣ Temel Sınıf
public class EmailNotifier : INotifier
{
public void Send(string message)
{
Console.WriteLine($"E-posta gönderildi: {message}");
}
}
3️⃣ Decorator Base Class
Decorator’ımız, temel davranışı (Notify) genişletmek için aynı interface’i uygular ve içerisinde bir Notifier örneğini kapsar.
public abstract class NotifierDecorator : INotifier
{
protected readonly INotifier _wrappee;
protected NotifierDecorator(INotifier notifier)
{
_wrappee = notifier;
}
public virtual void Send(string message)
{
_wrappee.Send(message);
}
}
4️⃣ Yeni Davranışlar: SMS ve Slack
public class SMSDecorator : NotifierDecorator
{
public SMSDecorator(INotifier notifier) : base(notifier) {}
public override void Send(string message)
{
base.Send(message);
Console.WriteLine($"SMS gönderildi: {message}");
}
}
public class SlackDecorator : NotifierDecorator
{
public SlackDecorator(INotifier notifier) : base(notifier) {}
public override void Send(string message)
{
base.Send(message);
Console.WriteLine($"Slack mesajı gönderildi: {message}");
}
}
🛠 Kullanım
class Program
{
static void Main(string[] args)
{
INotifier notifier = new EmailNotifier(); // Temel bileşen
notifier = new SMSDecorator(notifier); // SMS desteği ekleniyor
notifier = new SlackDecorator(notifier); // Slack desteği ekleniyor
notifier.Send("Sistem uyarısı!");
}
}
🖨 Console Çıktısı:
E-posta gönderildi: Sistem uyarısı!
SMS gönderildi: Sistem uyarısı!
Slack mesajı gönderildi: Sistem uyarısı!
📊 Decorator Pattern’ın Avantajları
- ✔️ Sınıfları değiştirmeden davranış ekleme/değiştirme
- ✔️ Runtime’da esnek nesne yapılandırması
- ✔️ Kod tekrarını azaltır
- ✔️ Open/Closed prensibini destekler
- ✔️ Sınıflar arasındaki sıkı bağımlılığı azaltır
⚠️ Dezavantajları
- ❌ Katman sayısı arttıkça yönetmesi zorlaşır
- ❌ Hata ayıklamak karmaşık hale gelebilir
- ❌ Tüm sınıfların aynı interface’e sahip olması gerekir
🖼 Diyagramla Gösterim
Aşağıda, Decorator Design Pattern’in UML diyagramını görebilirsiniz:

🧩 Farklı Kütüphanelerde Kullanımı (Bonus)
.NET’te bazı iç yapılar da bu deseni kullanır:
- **Streams (FileStream, MemoryStream vs.)**
- **ASP.NET Core Middleware mimarisi**
🏁 Sonuç
🔚 Decorator Design Pattern, programlamada esnekliğin anahtarıdır. Yeni ihtiyaçlar karşısında sınıfınızı yıkıp yeniden yazmak yerine, onu “süsleyerek” güçlendirebilirsiniz. Özellikle C# ve .NET projelerinde bu deseni bilmek, yazılım kalitenizi ciddi oranda artıracaktır.
Eğer modüler ve sürdürülebilir yazılım geliştirme hedefiniz varsa, bu deseni projelerinizde mutlaka deneyin.
📬 Sizi Dinliyoruz!
- ✔️ Bu desen hakkında siz ne düşünüyorsunuz?
- ✔️ Kendi projelerinizde Decorator kullandınız mı?
Yorumlarda bizimle paylaşın! 👇
Etiketler: #DecoratorPattern #DesignPatterns #CSharp #DotNet #YazılımMimarisi #OOP #TasarımDesenleri
👨💻 Daha fazla tasarım deseni öğrenmek istiyorsanız serimizin diğer yazılarına göz atabilirsiniz:
👉 Programlamada Tasarım Desenleri #1 – Singleton Pattern Nedir?
Yazan: Bir Yazılım Mühendisi
Tarih: 2024
Yazıyı faydalı bulduysanız paylaşmayı unutmayın! 💙