Durum

Nesnenin durumu değiştiğinde, davranışı da değişiyorsa, yani nesneler farklı durumlarda, farklı davranışlar gösteriyorsa, durum tasarım deseni kullanılabilir. Bu tasarım deseninin kullanılması, nesnelerin durumlarına bağlı değişen davranışlarının karmaşık "if/else" veya "switch" ifadeleriyle kontrol edilmesini önler.

Örnek :

Örnekte durumu çalışma zamanında değişen banka hesabı vardır. Banka hesaplarının durumları HesapDurumu arayüz sınıfından türemektedir. Bu arayüz sınıfından türeyen NormalHesap ve AltınHesap sınıfları bulunmaktadır. Bu alt sınıfların para çekme ve faiz ödeme davranışları farklıdır. İçerik sınıfı olan Hesap sınıfı hesap durum nesnesini içermektedir. Hesap durumuna göre de bu sınıf hesap içeriğini kontrol etmektedir. İstemci sınıfı olan Müşteri sınıfında bir tane hesap nesnesi bulunmaktadır. Çalışma zamanında hesabın durumu normal hesaptan altın hesaba çevrilmektedir. Durum değiştikten sonra da, nesnenin davranışı değişmektedir.

Örnek Sınıf Çizelgesi :

Örnek Java Kodu : ( Kodlar java 1.6.0.7 ile derlenip, çalıştırılmıştır. )

HesapDurumu.java :

public interface HesapDurumu {

void paraÇek();

void faizÖde();

}

NormalHesap.java :

public class NormalHesap implements HesapDurumu {


@Override

public void faizÖde() {

System.out.println( "Normal hesaptan faiz ödendi." );

}


@Override

public void paraÇek() {

System.out.println( "Normal hesaptan para çekildi." );

}

}

AltınHesap.java :

public class AltınHesap implements HesapDurumu {


@Override

public void faizÖde() {

System.out.println( "Altın hesaptan faiz ödendi." );

}


@Override

public void paraÇek() {

System.out.println( "Altın hesaptan para çekildi." );

}

}

Hesap.java :

public class Hesap {

private HesapDurumu hesapDurumu;


public Hesap() {

hesapDurumu = new NormalHesap();

}


public void faizÖde() {

hesapDurumu.faizÖde();

}


public void paraÇek() {

hesapDurumu.paraÇek();

}


public void durumDeğiştir( HesapDurumu hesapDurumu ) {

this.hesapDurumu = hesapDurumu;

}

}

Müşteri.java :

public class Müşteri {


public static void main(String[] args) {

// Yaratılan hesap varsayılan olarak 'normal' durumda.

Hesap hesap = new Hesap();

hesap.faizÖde();

hesap.paraÇek();


// Çalışma zamanında hesap durum değiştiriliyor.

// Müşteri altın hesaba geçiriliyor.

hesap.durumDeğiştir( new AltınHesap() );


// Durum değiştiği için davranış da değişecek.

hesap.faizÖde();

hesap.paraÇek();

}

}