Tasarım Desenleri
Nesneye Dayalı Programlamada Sınıf İlişkileri Nasıl Olmalı?
Testçiler sizin düşmanınız değildir. Esas düşman yazılım hatalarıdır!
Davranışsal Tasarım Desenleri

Gözlemci ( Observer ) Tasarım Deseni

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 Uygulama

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.

/**
*
@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.observer;

/**
* Konu.java
*
* Tarih bilgisi : May 24, 2014
*/
public interface Konu {

 
void gözlemcilereHaberVer();

 
void gözlemciEkle( FiyatGözlemcisi gözlemci );
}
/**
*
@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.observer;

import java.util.ArrayList;
import java.util.List;

/**
* FiyatKonusu.java
*
* Tarih bilgisi : May 24, 2014
*/
public class FiyatKonusu implements Konu {

 
private final List< FiyatGözlemcisi >  gözlemciListesi  = new ArrayList< FiyatGözlemcisi >();
 
private long              fiyat;

 
@Override
 
public void gözlemcilereHaberVer() {
   
for ( final FiyatGözlemcisi gözlemci : gözlemciListesi ) {
     
gözlemci.güncelle( fiyat );
   
}
  }

 
@Override
 
public void gözlemciEkle( final FiyatGözlemcisi gözlemci ) {
   
gözlemciListesi.add( gözlemci );
 
}

 
public void fiyatDeğiştir( final long fiyat ) {
   
this.fiyat = fiyat;
    gözlemcilereHaberVer
();
 
}
}
/**
*
@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.observer;

/**
* FiyatGözlemcisi.java
*
* Tarih bilgisi : May 24, 2014
*/
public interface FiyatGözlemcisi {

 
void güncelle( long yeniFiyat );
}
/**
*
@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.observer;

/**
* Müşteri1.java
*
* Tarih bilgisi : May 24, 2014
*/
public class Müşteri1 implements FiyatGözlemcisi {

 
@Override
 
public void güncelle( final long yeniFiyat ) {
   
System.out.println( "Müşteri 1, yeni fiyatı öğrendi: " + yeniFiyat );
 
}
}
/**
*
@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.observer;

/**
* Müşteri2.java
*
* Tarih bilgisi : May 24, 2014
*/
public class Müşteri2 implements FiyatGözlemcisi {

 
@Override
 
public void güncelle( final long yeniFiyat ) {
   
System.out.println( "Müşteri 2, yeni fiyatı öğrendi: " + yeniFiyat );
 
}
}
/**
*
@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.observer;

/**
* Satıcı.java
*
* Tarih bilgisi : May 24, 2014
*/
public class Satıcı {

 
public static void main( final String[] args ) {

   
// Bir gözlem konusu yaratılıyor.
   
final FiyatKonusu konu = new FiyatKonusu();

   
// Gözlemci 1 yaratılıyor ve gözlem konusuna ekleniyor.
   
konu.gözlemciEkle( new Müşteri1() );

   
// Gözlemci 2 yaratılıyor ve gözlem konusuna ekleniyor.
   
konu.gözlemciEkle( new Müşteri2() );

   
// Gözlem konusundaki bir değişiklik, gözlemcilere haber veriliyor.
   
konu.fiyatDeğiştir( 50L );
 
}
}
Müşteri 1, yeni fiyatı öğrendi: 50
Müşteri 2, yeni fiyatı öğrendi: 50

Yorumlar

Henüz bu sayfa için bir yorum yapılmamıştır.

Yorum Yaz, Düşüncelerini Paylaş

Not: Zorunlu alanlar yıldız (*) ile belirtilmiştir.

Kişisel Bilgiler

E-posta adresiniz kimse ile paylaşılmayacaktır. Gerekli olduğunda sizinle iletişim sağlamak için kullanılacaktır.

Yorum Alanı
Giriş Kontrol


Tüm java kodları "jdk1.7.0_09" ile derlenmiş ve çalıştırılmıştır.

Tüm hakları saklıdır. ©  "İlker KONAR" | İletişim: bilgi@tasarimdesenleri.com