Gözlemci
Bir nesnenin durumlarında değişiklik olduğunda, bu değişikliklerden haberdar olmak isteyen diğer nesnelere haber verilmesi gerektiği durumlarda bu tasarım deseni kullanılır. Bu haber verilme işlemi sırasında, haber verilecek nesnelerin birbirlerine bağımlı olması istenmez. Yani kısaca dinleyici konumunda bulunan bir çok nesne, bir nesnenin durumunu sürekli gözlemler. Bir değişiklik sırasında gözlemcilere haber verilir.
Örnek :
Bu örnekte, gözlemlenen konu herhangi bir ürünün fiyatıdır. Bu fiyatı gözlemleyenler ise, bu ürünü almak isteyen müşterilerdir. Müşteri1 ve Müşteri2 sınıfları FiyatGözlemcisi arayüz sınıfından türemektedirler. Bu sınıflardaki güncelle yordamı çağrıldığında, müşteriler yeni fiyat bilgisini alıp ona göre bir hareket belirlemektedirler. Gözlemci tasarım deseninde bir tane konu nesnesi bulunmaktadır. Bu nesne gözlemlenen şeyi belirler. Bu örnekteki konu fiyat olduğu için, ilgili sınıfa FiyatKonusu ismi verilmektedir. Bu sınıfta gözlemcileri içeren, bir tane liste tutulmaktadır. Bu listeye ekleme yapabilen, gözlemciEkle yordamı bulunmaktadır. Ayrıca fiyatın güncellendiğini gözlemcilere haber vermek için gözlemcilereHaberVer yordamı bulunmaktadır. Bu yordam listedeki tüm gözlemcilerin güncelle yordamını çağırarak, onların değişiklikten haberdar olup, ona göre bir hareket almalarını sağlar. Satıcı sınıfı da istemci olup, bu tasarım desenini sınamamıza yarar.
Örnek Sınıf Çizelgesi :
Örnek Java Kodu : ( Kodlar java 1.6.0.7 ile derlenip, çalıştırılmıştır. )
FiyatGözlemcisi.java :
public interface FiyatGözlemcisi {
void güncelle( long yeniFiyat );
}
Müşteri1.java :
public class Müşteri1 implements FiyatGözlemcisi {
@Override
public void güncelle( long yeniFiyat ) {
System.out.println( "Müşteri 1, yeni fiyatı öğrendi: "
+ yeniFiyat );
}
}
Müşteri2.java :
public class Müşteri2 implements FiyatGözlemcisi {
@Override
public void güncelle( long yeniFiyat ) {
System.out.println( "Müşteri 2, yeni fiyatı öğrendi: "
+ yeniFiyat );
}
}
Konu.java :
public interface Konu {
void gözlemcilereHaberVer();
void gözlemciEkle( FiyatGözlemcisi gözlemci );
}
FiyatKonusu.java :
import java.util.ArrayList;
import java.util.List;
public class FiyatKonusu implements Konu {
private List < FiyatGözlemcisi > gözlemciListesi =
new ArrayList < FiyatGözlemcisi > ();
private long fiyat;
@Override
public void gözlemcilereHaberVer() {
for ( FiyatGözlemcisi gözlemci : gözlemciListesi ) {
gözlemci.güncelle( fiyat );
}
}
@Override
public void gözlemciEkle( FiyatGözlemcisi gözlemci ) {
gözlemciListesi.add( gözlemci );
}
public void fiyatDeğiştir( long fiyat ) {
this.fiyat = fiyat;
gözlemcilereHaberVer();
}
}
Satıcı.java :
public class Satıcı {
public static void main(String[] args) {
FiyatKonusu konu = new FiyatKonusu();
konu.gözlemciEkle( new Müşteri1() );
konu.gözlemciEkle( new Müşteri2() );
konu.fiyatDeğiştir( 50L );
}
}