State Tasarım Deseni (State Design Pattern)

Ahmet ÇELİK
3 min readFeb 8, 2021

--

State (durum) davranışsal tasarım deseni, nesnenin çalışma zamanı içerisinde oluşan farklı durumlarda farklı davranışlar gösterebilmesini sağlar. Bu işlem, anlık durumun tutulduğu bir değişkenin metoda iletilerek ve metot içerisinde de şart bloklarıyla (if/else — switch/case) nesnenin nasıl davranması gerektiği şeklinde de gerçekleştirilebilirdi. Ancak çok sayıda durumun olduğu bir örnekte; geliştirici açısından kodu takip etmek, ekleme çıkarma yapmak gittikçe zorlaşabilir. Dolayısıyla state tasarım deseni; modüler, yalın ve daha anlaşılır kodu da beraberinde getirir.

Buna göre, 3 temel kavram bulunur. İlki olan bağlam (Context) sınıfı, istemcinin etkileşimde bulunup aktif durumu değiştirebileceği ve aktif durumdan metot çağırabileceği bir ara yüz sunar. İkincisi olan State soyut sınıfı veya ara yüzü, kendisine bağlı “Somut sınıf” olarak tanımlı durumların ne yapması gerektiğini tanımlar. Sonuncusu olan “Somut sınıf” olarak tanımlı durumlar ise override edilmiş metotlar için uygulama sağlar.

State Design Pattern UML Class Diagram

Örnek olarak yukarıda verilen sınıf diyagramında, State soyut sınıfına goNext metodu tanımlanmıştır. Bu metot duruma göre farklı davranış göstereceğinden her bir durum için bir sınıf oluşturulur. StateOne, StateTwo, StateThree sınıflarından anlaşılacağı üzere, oluşturulan her sınıf State sınıfından miras alır ve goNext metodu override edilir. İstemcinin durumları değiştirip goNext metodunu kullanabilmesi için Context sınıfı oluşturulur. Bu sınıfta setState metoduna parametre gönderilerek durum değiştirilebilir. current değişkeni kullanılarak aktif duruma ulaşılabilir ve goNext metoduyla da aktif durumdaki goNext metodu çağrılabilir.

State.java// Farklı durumları bir çatı altında toplayan (base) soyut sınıfpublic abstract class State {// Duruma göre farklı davranış gösterebilen metotpublic abstract void goNext(Context context);}StateOne.java// İlk durumpublic class StateOne extends State {  @Override  // İlk durumdaki goNext metodunun davranışı  public void goNext(Context context) {  System.out.println("go next: StateOne");  }}

StateOne sınıfında yapılan işlemler aynı şekilde StateTwo ve StateThree sınıfı için de yapılır.

StateTwo.javapublic class StateTwo extends State {(...)
}
StateTwo.javapublic class StateTwo extends State {(...)
}

Durumlar ve bu durumlardaki davranışlar tanımlandı.

Context.java// Durumları ve duruma bağlı davranışları yöneten Bağlam sınıfıpublic class Context {// Aktif durumu belirten referans.private State current;public Context() {// varsayılan durumcurrent = new StateOne();}// Çalışma zamanında durumu değiştirmeyi sağlar.public void setState(State state) {System.out.println("State Değiştirildi: " +state.getClass().getSimpleName());current = state;}// Farklı durumlarda farklı davranış gösterecek olan metodu çağırır.public void goNext() { current.goNext(this); }
}
Context context = new Context();context.setState(new StateThree());context.goNext();

Context sınıfından üretilen nesne ile yukarıda tanımlandığı gibi durum değiştirilebilir ve ilgili duruma bağlı davranış sergilenebilir.

Bonus Örnek

Bir banka uygulaması, giriş ve önemli bir işlem yapmadan önce güvenlik amaçlı kullanıcıdan ek bir doğrulama istemektedir. Bu doğrulama; parmak izi, kısa mesaj veya E-Posta üzerinden yapılabilmektedir. Doğrulama işlemi varsayılan olarak kısa mesaj üzerinden yapılmakta ve kullanıcı istediği zaman doğrulama türünü değiştirebilmektedir.

Böyle bir senaryo için State (Durum) davranışsal tasarım deseni kullanılabilir. Buna göre sınıf diyagramı ve kod yapısı aşağıdaki gibi olmalıdır.

state.getClass().getSimpleName());current = state;}// Farklı durumlarda farklı davranış gösterecek olan metodu çağırır.public void goNext() { current.goNext(this); }}

--

--

Ahmet ÇELİK

Mobil uygulama geliştirici, gündeme dair konular ve yazılım trendleriyle ilgili özgür bir yazılımcı.