Harun Özer


Proje veya dijital katalog yaptırmak için
iletişim formu doldurabilirsiniz..

<< Observer Tasarım Deseni - Observer Design Pattern | Strategy Tasarım Deseni - Strategy Design Pattern>>

State Tasarım Deseni - State Design Pattern

Yazar harunozer 01 December 2012

State Tasarım Deseni - State Design Pattern State tasarım deseni behavior grubununa ait, nesnelerin farklı durumlarda farklı çalışmalarını düzenleyen bir tasarım desenidir. dofactory.com sitesine göre kullanım sıklığı %60 civarındadır ve uygulanması kolay tasarım desenlerinden biridir.

State tasarım deseni; bir nesnedeki bir özellik değiştirildiğinde o nesnenin çalışmasını değiştirmesini veya o durum için kod işlemesini düzenler. Bunu basit bir şekilde gerçekleştirir. Şöyle ki; içinde bir arayüzün referansını tutar ve property si değiştiğinde o arayüze o arayüzden türeyen başka bir nesne atar. Senaryoya göre bu arayüzde ki işlemi kendi tetikler veya sonraki istekte bu arayüzde ki işlem tetiklenir.

Örneğin telefonların kapatma tuşu telefon açık ise kapatır kapalı ise telefonu açar.

Veya bir teknik servis uygulaması yapmaktayız ve teknik servise gelen ürünün durumu değiştiğinde farklı işlemler yapıyoruz. Mesela ürün kabul işlemi yapıldığında yani ürünün durumu “giriş yapıldı” olduğunda müşteriye sms ile takip kodu göndermek, “parça bekliyor” olduğunda değişim olacak parçanın hazırlanması için depo birimindeki yazıcıdan otomatik yazıcı çıktısı aldırmak, “kargo bekliyor” durumunda kargo şirketinin sağladığı web servise kargo alınması gerektiğini bildirmek gibi.

Veya bir e-ticaret uygulaması yapıyoruz ve sipariş “ödeme onaylandı” durumuna gelince faturası otomatik olarak muhasebe programına işleniyor. ”Hazırlanıyor” durumuna getirildiğinde depo elemanının siparişi hazırlamasını bildiriyor. “Kargoya Verildi” durumuna gelince de müşteriye kargo takip numarasını mail olarak gönderiyor.

State tasarım deseninin uygulanışına geçmeden önce uml şemasına göz atalım.

state_design_pattern_uml

Uml şemasından da anlaşılacağı üzere Context nesnesi içinde State nesnesi referansı barındırır ve State arayüzünden türeyen ConcreteState nesnelerini tutar. State arayüzü referansında değişme olduğunda çalıştırılacak olan metodu tanımlar. Context ise barındırdığı State nesnesinde değişiklik olduğunda duruma göre ConcreteState nesnelerindeki Do komutunu çalıştırır.

State tasarım desenini daha iyi anlamak için örnek bir uygulama yapalım. Örnek uygulamamız da içinde Do adında bir metot ve port değişkeni tutan bir nesnemiz olsun. Do metodu her çalıştırıldığında port açılsın, açık ise dinlensin, dinleniyor ise kapatılsın. Uygulamamızın class diyagramı aşağıdaki gibidir.

Uygulamamızda Soket sınıfı Context yapısına karşılık gelmektedir. Ve Do metodu her çalıştırıldığında içinde barındırdığı ISoketState arayüzünden türeyen nesnenin Handle metodunu çalıştırır ve parametre olarak kendisini verir. ConcreteState nesnelerinde uygulanan Handle metotlarında ise parametre olarak gönderilen Soket nesnesinde ki State referansına sonra ki durum nesnesi referansı atanır. Böylece Soket sınıfının Do metodu bir sonraki çağrılmasında bu yeni atanan referansın Handle metodunu çalıştırır.

Uygulamamızın kodu aşağıdadır.

//State
interface ISoketState
{
    void Handle(Soket s);
}

//ConcreteState
class SoketStateAc:ISoketState
{
    public void Handle(Soket s)
    {
        Console.WriteLine("{0} Port soket açıldı.",s.Port);
        /*Context birdahaki çalışmasında SoketStateDinle nesnesine göre çalışacak*/
        s.State = new SoketStateDinle();
    }
}
//ConcreteState
class SoketStateDinle : ISoketState
{
    public void Handle(Soket s)
    {
        Console.WriteLine("{0} Port soket Dinleniyor.",s.Port);
        /*Context birdahaki çalışmasında SoketStateKapat nesnesine göre çalışacak*/
        s.State = new SoketStateKapat();
    }
}
//ConcreteState
class SoketStateKapat:ISoketState
{
    public void Handle(Soket s)
    {
        Console.WriteLine("{0} Port soket Kapatıldı.", s.Port);
        /*Context birdahaki çalışmasında SoketStateAc nesnesine göre çalışacak*/
        s.State = new SoketStateAc();
    }
}
//Context
class Soket
{
    public int Port { get; set; }
    public Soket(int Port)
    {
        this.Port = Port;
        State = new SoketStateAc();
    }
    private ISoketState _State { get; set; }
    public ISoketState State
    {
        get { return _State; }
        set {
            _State = value;
            /*Senaryoya göre Handle burada da çalıştırılabilir.*/
        }
    }
    public void Do()
    {
        State.Handle(this);
    }
}
class Program
{
    static void Main(string[] args)
    {
        /*
        Soket nesnesini oluşturuyoruz
        her Do metodunu çalıştırdığımızda farklı işlemler çalışacaktır.
        */
        Soket s = new Soket(8080);
        s.Do();
        s.Do();
        s.Do();
        Console.ReadKey();
    }
}
 
Örnek kodları aşağıdaki linkten indirebilirsiniz.

StateSample.rar

Tam Sayfa
Tags tasarım desenleri,
Kategoriler c#.net, Tasarım Desenleri
İşlemler
Bu Makale 1  Kez Beğenildi.
İsim :    
e-Mail :    
Web Site :  
İmage :  
Güvenlik Kodu :  

Güvenlik Resmi
Resmi Yenile
    
Yorum :  
Tasarım Desenleri ve Mimarileri