Skip to content

Observer

Bu yazımda size Observer adındaki nesneye dayalı yazılım şablonunu (Object-Oriented Design Pattern) anlatacağım. Bu şablonun genel amacı bir objeyle başka objeler arasında bağ kurmaktır (One to many dependency). Yani eğer objenin birinde güncelleme olduysa diğerlerinde de bunun yansımasını sağlamaktır. Burada objeler arasında da çok fazla bağ(not tightly coupled) kurmadan işlemleri yapmaya yarar. Peki nerelerde kullanılır ? Eğer bir objede olan değişiklik diğer objelerin güncellenmesini gerektiriyorsa kullanılabilir. Yada bir obje diğer objelerin hakkında bilgi sahibi olmadan onları güncellemesi gerektiğinde yine bu şablon kullanılabilir. Size aşağıda verdiğim kod kısmında ise bu şablonun nasıl kullanıldığını göstermek istiyorum. Kodu kısaca anlatacak olursak Observer adlı bir interface kullanıyoruz. Bu interface den yararlanarak(implement) yazdığımız iki obje var. Bunlardan biri BoxChart diğeri ise PieChart. Başka bir sınıf(class) olarakta Observable ve bundan yararlanarak ürettiğimiz ConcreteObservable sınıfımızı görmekteyiz. Bunlarda sınıflar arası iletimi sağlayacak elemanlarımız. En sonunda ChartHandler adlı bir sınıfta da uyguladığımız şablonu çalıştırıyoruz. Bu şablon genel olarak kullanıcı arayüzü yapımında kullanılır. Örnek verecek olursak Java bir çok kütüphanesi bu şablonu kullanır.observer

public interface Observer{
    public void handleNotification();
}
public interface Observable{
	public void addObserver(Observer observer);
	public void removeObserver(Observer observer);
	public void notifyObservers();
}
public class BoxChart implements Observer{
	int [] data;
	public BoxChart(int [] data){
		this.data = data;
	}
	public void handleNotification(){
		System.out.println("Box Chart data is : "+data[0]);
	}
}
public class PieChart implements Observer{
	int [] data;
	public PieChart(int [] data){
		this.data = data;
	}
	public void handleNotification(){
		System.out.println("Pie Chart data is : "+data[0]);
	}
}
import java.util.ArrayList;
public class ConcreteObservable implements Observable{
	private ArrayList<Observer> list;
	public ConcreteObservable(){
		list = new ArrayList<Observer>();
	}
	public void addObserver(Observer observer){
		list.add(observer);
	}
	public void removeObserver(Observer observer){
		list.remove(observer);
	}
	public void notifyObservers(){
		for(int i=0;i<list.size();i++)
			list.get(i).handleNotification();
	}
}
public class ChartHandler{
	public static void main (String [] args){
		int [] data = {5};
		//We do not use int since we want to pass 
		//data by reference by using int array instead.
		BoxChart boxChart = new BoxChart(data);
		PieChart pieChart = new PieChart(data);
		ConcreteObservable observable = new ConcreteObservable();
		observable.addObserver(boxChart);
		observable.addObserver(pieChart);
		observable.notifyObservers();
		data[0] = 10;
		observable.notifyObservers();
	}
}

One Comment

  1. Oguzhan Gedik Oguzhan Gedik

    Gercekten kisa ve net bir sekilde anlasilir bir yazi olmus tesekkurler.

Leave a Reply

Your email address will not be published. Required fields are marked *