C# State Design Pattern(State Tasarım Deseni)
Ekstra Senaryo
Senaryomuzun genel izahati şöyledir. Kullanıcının e-ticaret üzerinden yaptığı siparişe dair aşağıdaki aşamalar sırasıyla gerçekleşecektir;
- Sipariş oluşturulmadan önceki durum (NoOrder) olarak nitelendirilecektir.
- Siparişin oluşturulması. Bu durum (Suspended) olarak nitelendirilecektir.
- Oluşturulan siparişin stok bilgilerinin güncellenmesi. Bu durum ise (StockReserved) olarak nitelendirilecektir.
- Siparişteki ürünlerin adetleri eğer mevcut stok miktarını geçiyorsa sipariş iptal edilecek ve (OrderCanceled) durumuna çekilecektir. İptal edilen siparişin ürün adetleri güncellenip tekrar denenebilecektir.
- Yok eğer stok miktarı siparişteki ürün adedini karşılıyorsa stok bilgileri güncellenecek ve (StockReserved) durumuna geçilecektir.
- Stok bilgileri güncellenen siparişin ödeme işlemi gerçekleştirilecektir. Bu durum ise (OrderCompleted) olarak nitelendirilecektir.
- Ödeme süreci başarıyla sonuçlanıyorsa (OrderCompleted) durumuna geçilecektir.
- Aksi taktirde sipariş başarısız olacağı için (OrderFailed) durumuna çekilecektir.
- Ve son olarak ödeme gerçekleştirildiğinde ise sipariş onaylanacak ve nakliye işlemleri devreye sokulacaktır. Bu durum ise (OrderCompleted) olarak nitelendirilecektir.
| UYGULAMADAKİ TÜM DURUMLAR | |
|---|---|
| NoOrder | Siparişin oluşturulmadığını ifade eder. |
| Suspended | Siparişin oluşturulduğunu ifade eder. |
| StockReserved | Stok bilgilerinin güncellendiğini ifade eder. |
| OrderCompleted | Siparişin başarıyla sonuçlandığını ifade eder. |
| OrderFailed | Siparişin başarısız sonuçlandığını ifade eder. |
| OrderCanceled | Siparişin iptal edildiğini ifade eder. |
Ekstra Senaryo Çözüm
//State
abstract class OrderState
{
public abstract void OrderCreate();
public abstract void StockReserve(int quantity);
public abstract void Payment(int totalPrice);
}
//Context
class OrderMachine
{
OrderState state;
OrderState noOrder;
OrderState suspend;
OrderState stockReserve;
OrderState payment;
OrderState orderCompleted;
OrderState orderFailed;
OrderState orderCanceled;
public OrderMachine()
{
noOrder = new NoOrder(this);
suspend = new Suspended(this);
stockReserve = new StockReserved(this);
orderCompleted = new OrderCompleted(this);
orderFailed = new OrderFailed(this);
orderCanceled = new OrderCanceled(this);
state = noOrder;
}
public int Stock { get; set; } = 1000;
public void SetNoOrder()
=> state = noOrder;
public void SetSuspended()
=> state = suspend;
public void SetStockReserved()
=> state = stockReserve;
public void SetOrderCompleted()
=> state = orderCompleted;
public void SetOrderFailed()
=> state = orderFailed;
public void SetOrderCanceled()
=> state = orderCanceled;
public void OrderCreate()
=> state.OrderCreate();
public void StockReserve(int quantit)
=> state.StockReserve(quantit);
public void Payment(int totalPrice)
=> state.Payment(totalPrice);
}
//Concrete State
class NoOrder : OrderState
{
OrderMachine _context;
public NoOrder(OrderMachine context)
=> this._context = context;
public override void OrderCreate()
{
Console.WriteLine("Sipariş oluşturuldu.");
_context.SetSuspended();
}
public override void Payment(int totalPrice)
=> Console.WriteLine("Sişarip oluşturmadan ödeme yapılamaz!");
public override void StockReserve(int quantit)
=> Console.WriteLine("Sipariş oluşturmadan stok güncellenemez!");
}
//Concrete State
class Suspended : OrderState
{
OrderMachine _context;
public Suspended(OrderMachine context)
=> this._context = context;
public override void OrderCreate()
=> Console.WriteLine("Sipariş zaten oluşturuldu...");
public override void Payment(int totalPrice)
=> Console.WriteLine("Stok güncellenmeden ödeme yapılamaz!");
public override void StockReserve(int quantit)
{
if (quantit > _context.Stock)
{
Console.WriteLine("Sipariş edilmek istenen ürün miktarı, stok miktarından fazladır!");
_context.SetOrderCanceled();
Console.WriteLine("Sipariş iptal edilmiştir.");
}
else
{
Console.WriteLine("Sipariş edilen ürün miktarı kadar stok başarıyla güncellenmiştir.");
_context.SetStockReserved();
Console.WriteLine($"Kalan stok miktarı : {_context.Stock - quantit}");
}
}
}
//Concrete State
class StockReserved : OrderState
{
OrderMachine _context;
public StockReserved(OrderMachine context)
=> this._context = context;
public override void OrderCreate()
=> Console.WriteLine("Sipariş zaten oluşturuldu...");
public override void Payment(int totalPrice)
{
if (totalPrice < 1500)
{
Console.WriteLine("Ödeme başarıyla gerçekleştirildi...");
_context.SetOrderCompleted();
}
else
{
Console.WriteLine("Yetersiz bakiye!");
_context.SetOrderFailed();
}
}
public override void StockReserve(int quantit)
=> Console.WriteLine("Stok bilgisi zaten güncelleştirildi...");
}
//Concrete State
class OrderCompleted : OrderState
{
OrderMachine _context;
public OrderCompleted(OrderMachine context)
=> this._context = context;
public override void OrderCreate()
=> Console.WriteLine("Sipariş zaten başarıyla tamamlandı...");
public override void Payment(int totalPrice)
=> Console.WriteLine("Sipariş zaten başarıyla tamamlandı...");
public override void StockReserve(int quantit)
=> Console.WriteLine("Sipariş zaten başarıyla tamamlandı...");
}
//Concrete State
class OrderFailed : OrderState
{
OrderMachine _context;
public OrderFailed(OrderMachine context)
=> this._context = context;
public override void OrderCreate()
=> Console.WriteLine("Sipariş başarısız sonuçlandı...");
public override void Payment(int totalPrice)
=> Console.WriteLine("Sipariş başarısız sonuçlandı...");
public override void StockReserve(int quantit)
=> Console.WriteLine("Sipariş başarısız sonuçlandı...");
}
//Concrete State
class OrderCanceled : OrderState
{
OrderMachine _context;
public OrderCanceled(OrderMachine context)
=> this._context = context;
public override void OrderCreate()
=> Console.WriteLine("Sipariş iptal edildi... Sipariş edilen ürün adedini güncelleyiniz!");
public override void Payment(int totalPrice)
=> Console.WriteLine("Sipariş iptal edildi... Sipariş edilen ürün adedini güncelleyiniz.");
public override void StockReserve(int quantit)
{
if (quantit > _context.Stock)
{
Console.WriteLine("Sipariş edilmek istenen ürün miktarı, stok miktarından fazladır!");
_context.SetOrderCanceled();
Console.WriteLine("Sipariş iptal edilmiştir.");
}
else
{
Console.WriteLine("Sipariş edilen ürün miktarı kadar stok başarıyla güncellenmiştir.");
_context.SetStockReserved();
Console.WriteLine($"Kalan stok miktarı : {_context.Stock - quantit}");
}
}
}
Yukarıda State Design Pattern mantığında gerekli tasarım oluşturulmuştur. Şimdi oluşturulan bu tasarımı net bir şekilde test edebilmek için aşağıdaki üç farklı şekilde kullanımı ele alıp sonuçlarını gözlemlemekte fayda vardır.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
İyi çalışmalar 🙂






