Durum ( State ) Tasarım Deseni
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 Uygulama
Ö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.
- UML Sınıf Çizelgesi
- HesapDurumu.java
- NormalHesap.java
- AltınHesap.java
- Hesap.java
- Müşteri.java
- Ekran Çıktısı

/**
* @author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/
package com.ilkerkonar.td.desen.ornekkodlar.state;
/**
* HesapDurumu.java
*
* Tarih bilgisi : May 24, 2014
*/
public interface HesapDurumu {
void paraÇek();
void faizÖde();
}
/**
* @author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/
package com.ilkerkonar.td.desen.ornekkodlar.state;
/**
* NormalHesap.java
*
* Tarih bilgisi : May 24, 2014
*/
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." );
}
}
/**
* @author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/
package com.ilkerkonar.td.desen.ornekkodlar.state;
/**
* AltınHesap.java
*
* Tarih bilgisi : May 24, 2014
*/
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." );
}
}
/**
* @author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/
package com.ilkerkonar.td.desen.ornekkodlar.state;
/**
* Hesap.java
*
* Tarih bilgisi : May 24, 2014
*/
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( final HesapDurumu hesapDurumu ) {
this.hesapDurumu = hesapDurumu;
}
}
/**
* @author İlker KONAR, Yazılım Kıdemli Uzmanı.
*
* Tasarım Desenleri Sitesi Kodları. Dikkat: Her hakkı saklıdır.
*/
package com.ilkerkonar.td.desen.ornekkodlar.state;
/**
* Müşteri.java
*
* Tarih bilgisi : May 24, 2014
*/
public class Müşteri {
public static void main( final String[] args ) {
// Yaratılan hesap varsayılan olarak 'normal' durumda.
final 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() );
System.out.println( "Müşteri altın hesaba geçiriliyor." );
// Durum değiştiği için davranış da değişecek.
hesap.faizÖde();
hesap.paraÇek();
}
}
Normal hesaptan para çekildi.
Müşteri altın hesaba geçiriliyor.
Altın hesaptan faiz ödendi.
Altın hesaptan para çekildi.
Yorumlar
Yorum Yaz, Düşüncelerini Paylaş