Programlamada Tasarım Desenleri #18 — State Design Pattern (dotnet c#)
Programlamada Tasarım Desenleri #18 — State Design Pattern (C# .NET ile Uygulamalı)
Tasarım desenleri serimizin 18. bölümünde “State Design Pattern” yani “Durum Tasarım Deseni”ni ele alıyoruz. Bu desen, bir nesnenin iç durumuna göre davranışını değiştirmesini sağlar. .NET dünyasında C# ile bu desenin nasıl etkin bir şekilde kullanılacağını örnek kodlarla açıklayarak detaylandırıyoruz.

🔍 State Design Pattern Nedir?
State Design Pattern, bir nesnenin davranışlarını, o nesnenin mevcut durumuna göre değiştirmek için kullanılır. Bu desen sayesinde if-else veya switch-case yapılarında boğulmak yerine, her durumu ayrı bir sınıf olarak tanımlayabilir ve nesnenin davranışını dinamik olarak değiştirebilirsiniz.
🎯 Amaç: Karmaşık kontrol akışlarını sadeleştirmek ve bakım kolaylığı sağlamak.
✅ Ne Zaman Kullanılır?
- Nesnenin davranışları, iç durumuna bağlı olarak değişiyorsa,
- Eğer bir nesne çok sayıda if/else veya switch-case blokları içeriyorsa,
- Durum geçişlerinin kodun çeşitli yerlerine dağılmasını istemiyorsanız.
👷♂️ .NET / C# ile State Pattern Uygulaması
Örnek bir Sipariş (Order) sistemi üzerinden ilerleyelim. Siparişin farklı durumları olabilir: Yeni, Hazırlanıyor, Kargoda, Teslim Edildi.
🧱 1. State Arayüzü (IOrderState)
public interface IOrderState
{
void ProcessOrder(Order order);
void ShipOrder(Order order);
}
🧱 2. Concrete State Sınıfları
Yeni Sipariş Durumu: `NewOrderState`
public class NewOrderState : IOrderState
{
public void ProcessOrder(Order order)
{
Console.WriteLine("Sipariş hazırlanıyor.");
order.SetState(new ProcessingOrderState());
}
public void ShipOrder(Order order)
{
Console.WriteLine("Sipariş işlenmeden kargoya verilemez!");
}
}
Hazırlanıyor: `ProcessingOrderState`
public class ProcessingOrderState : IOrderState
{
public void ProcessOrder(Order order)
{
Console.WriteLine("Sipariş zaten hazırlanıyor.");
}
public void ShipOrder(Order order)
{
Console.WriteLine("Sipariş kargoya veriliyor.");
order.SetState(new ShippedOrderState());
}
}
Kargoya Verildi: `ShippedOrderState`
public class ShippedOrderState : IOrderState
{
public void ProcessOrder(Order order)
{
Console.WriteLine("Sipariş zaten kargoda.");
}
public void ShipOrder(Order order)
{
Console.WriteLine("Sipariş çoktan gönderildi.");
}
}
🧱 3. Context Sınıfımız: `Order`
public class Order
{
private IOrderState _currentState;
public Order()
{
_currentState = new NewOrderState(); // Başlangıç durumu
}
public void SetState(IOrderState newState)
{
_currentState = newState;
}
public void ProcessOrder()
{
_currentState.ProcessOrder(this);
}
public void ShipOrder()
{
_currentState.ShipOrder(this);
}
}
🧪 Örnek Kullanım
class Program
{
static void Main(string[] args)
{
Order order = new Order();
order.ProcessOrder(); // Durum: Hazırlanıyor
order.ShipOrder(); // Durum: Kargoda
order.ProcessOrder(); // Kargoya verildiği için değişiklik olmayacak
}
}
📌 Çıktı:
Sipariş hazırlanıyor.
Sipariş kargoya veriliyor.
Sipariş zaten kargoda.
📊 State Design Pattern’in Avantajları
| Avantajlar | Açıklama |
|---|---|
| 🔄 Esnek Davranış Kontrolü | Nesneye göre farklı durumlar rahatça yönetilir. |
| 🧼 Daha Temiz Kod Yapısı | Karmaşık if-else/switch-case’lerden kurtulursunuz. |
| ♻️ Açık-kapalı prensibi (OCP) | Yeni durumları sınıf ekleyerek kolayca genişletebilirsiniz. |
| 🧠 Anlaşılır Kod Akışı | Her durum kendi sorumluluğunda oldukça okunabilirlik artar. |
🎨 Görsel ile Özet (State Pattern Diagramı)
Kaynak: Wikipedia – State Pattern UML
🤔 Gerçek Hayattan Örnek Uygulamalar
- Banka hesabı durumu (Aktif, Devre Dışı, Bloke)
- Trafik lambası kontrolü (Yeşil, Sarı, Kırmızı)
- Video oynatıcı durumları (Oynat, Durdur, Duraklat)
- Mobil sipariş uygulamaları (Yeni, Hazırlanıyor, Kargoda, Teslim)
✅ Özet
State Pattern, yazılım mimarisinde davranışsal tasarım desenleri arasında önemli bir yere sahiptir. Nesnelerin iç durumlarına göre davranışlarını dinamik olarak değiştirmesi gereken senaryolarda ciddi anlamda kodun okunabilirliğini ve sürdürülebilirliğini artırır.
🛠 İlgili Kaynaklar
- GOF – Design Patterns
- Microsoft Learn – Behavioral Design Patterns
- Pluralsight – Design Patterns in C#
🗨️ Sizin Projelerinizde Kullandınız mı?
Siz bu deseni nerelerde kullanıyorsunuz? Yorumlarda paylaşın! 👇
📌 Etiketler: State Design Pattern, Tasarım Desenleri, Behavioral Patterns, C#, .NET, OOP, Design Patterns, Software Architecture
Hazır mısınız? Bir sonraki yazımızda “Strategy Design Pattern”ı uygulamalı olarak inceleyeceğiz.
📌 Takipte kalın ve bültene abone olun!



