Java’daki Yerleşik Observer Patern’i idiom’ları

JAVA’daki Yerleşik Observer Özellikleri

Aşağıdaki yazı UML ve Dizayn Patern’leri kitabımdan alıntıdır, izinsiz alıntı yapılamaz !

JDK 1.0’da kütüphaneye eklenmiş olan java.util paketindeki Observer isimli interface, durum bilgisi  değiştiğinde kendisini gözlemleyen nesnelere uyarı gönderebilen nesneler için gerekli eylemi (update fonksiyonunu) tanımlar.

void update(Observable o, Object arg)

Observable ise aynı paketteki bir sınıftır. Genel amacı; MVC’deki Model-View paradigma’sındaki gözlemlenebilen model nesnelere türetme yoluyla temel karakteristikleri kazandırmaktır. Her observable nesne’yi gözlemleyen n tane observer nesne olabilir. Bu yapıda observer nesneler ise Observer interface’ini implemente eden nesneler olmalıdır. Observable olan nesne, durumu değiştiğinde notifyObservers() fonksiyonunu çağırır. Bu fonksiyon ise observer olan nesnelerin update() fonksiyonlarının çağırılmasına neden olur ve observer nesneler de kendilerini güncellerler.  Bu fonksiyonun Object paremetreli overload versiyonu observer’lara ek bilgi gönderebilmeyi sağlar.

public void notifyObservers(Object arg)

setChanged() fonksiyonunun herhangi bir t anında çağrılması observable nesnenin durumunun değiştiğini ifade etmeyi sağlar. Bu fonksiyon çağrıldıktan sonra bir değişim olduğunu belirten hasChanged() fonksiyonu true değer döndürecektir.

Sınıfın addObserver(Observer o) ve deleteObserver(Observer o) fonksiyonları ise Observer interface’ini implemente eden nesnelerin register ve unregister edilme işlemlerini gerçekleştirir. Aşağıdaki örnekte bu sınıf ve interface’ler kullanılmaktadır. Örneğin senaryosu; HisseSenedi isimli observable nesneyi izleyen Yatirimci isimli sınıfa ait observer nesnelerden oluşmaktadır. Hisse senedinin değeri değişirse ve set edilen değer yatırımcıların satış için baz aldığı kritik değerin altına düşerse söz konusu yatırımcılar satış yapmaktadırlar.

import java.util.Observable;

import java.util.Observer;

import java.util.ArrayList;

public class HisseSenedi extends Observable

{

private int degeri;

private String adi;

private ArrayList<Yatirimci> yatirimcilari;

public int getDegeri()

{

return degeri;

}

public void setDegeri(int d)

{

if (d < this.degeri)

{

// Hissenin değeri düşmüşse uyar ve yeni değeri set et

setChanged();

this.degeri = d;

notifyObservers();

}

else

{

// sadece yeni değeri set et

this.degeri = d;

}

}

public String getAdi()

{

return adi;

}

public void setAdi(String adi)

{

this.adi = adi;

}

public HisseSenedi(String adi, int degeri)

{

this.adi = adi;

this.degeri = degeri;

yatirimcilari = new ArrayList<Yatirimci>();

}

@Override

public synchronized void addObserver(Observer o)

{

yatirimcilari.add((Yatirimci) o);

}

@Override

public synchronized void deleteObserver(Observer o)

{

yatirimcilari.remove(o);

}

@Override

public void notifyObservers()

{

// değişim olmuşsa yatırımcıları uyar

if (hasChanged())

{

for (Yatirimci y : yatirimcilari)

{

y.update(this, degeri);

}

}

}

@Override

public synchronized int countObservers()

{

return yatirimcilari.size();

}

@Override

public String toString()

{

return adi + “, Değeri : ” + degeri + ” TL”;

}

}

////////////////////////////////////////////////

import java.util.Observable;

import java.util.Observer;

public class Yatirimci implements Observer

{

private String isim;

private int kritikDeger;

private int lot;

public String getIsim()
{

return isim;

}

public Yatirimci(String isim, int kritikDeger, int lot)

{

this.isim = isim;

this.kritikDeger = kritikDeger;

this.lot = lot;

}

public void hisseSatisi(int adet, int deger)

{

/* Hissenin değeri yatırımcının belirlediği kritik değerin

altına düşerse adet kadar satış yapacaktır */

if (deger <= kritikDeger)

{

lot -= adet;

}

}

@Override

public void update(Observable o, Object arg)

{

int dgr = (Integer) arg ;

int tDeger = dgr * lot;

hisseSatisi(lot, dgr);

System.out.println(“Yatırımcı : ” + isim +

” hisselerinin toplam değeri : ” + tDeger + ” TL”);

}

}

////////////////////////////////////////////////

public class Test

{

public static void main(String[] args)

{

HisseSenedi hs = new HisseSenedi(“Orfe Yazılım”, 1000);

Yatirimci y1 = new Yatirimci(“Aykut TAŞDELEN”, 400, 60);

Yatirimci y2 = new Yatirimci(“Kerimhan BAÇ”, 300, 1200);

Yatirimci y3 = new Yatirimci(“Eren BAÇ”, 700, 3000);

hs.addObserver(y1);

hs.addObserver(y2);

hs.addObserver(y3);

hs.setDegeri(500);

System.out.println(hs.toString());

System.out.println(“Kağıdı izleyen yatırımcı adedi : ”

  • hs.countObservers());

// 2. yatırımcı izlemeyi bırakıp tüm kağıtlarını satmıştır

hs.deleteObserver(y2);

System.out.println(“————-“);

hs.setDegeri(320);

System.out.println(hs.toString());

System.out.println(“Kağıdı izleyen yatırımcı adedi : ”

  • hs.countObservers());

}

}

NOT : Bu yazı Aykut TAŞDELEN’in C++ Java ve C# ile UML ve Dizayn Paternleri kitabından alıntıdır izinsiz kullanılıp alıntı yapılamaz ! Konunun devamı söz konusu kitapta yer almaktadır.

Reklamlar