Observer Pattern (Gözlemci Tasarım Kalıbı), bir nesnenin durumundaki değişikliklerin, ona bağlı olan diğer nesnelere otomatik olarak bildirilmesini sağlayan davranışsal (behavioral) tasarım desenlerinden biridir. Bu desen, publish-subscribe (yayınla-abone ol) mekanizmasını temel alarak nesneler arasındaki bağımlılığı en aza indirir.
Ne Zaman Kullanılmalıdır?
Observer Pattern şu durumlarda kullanışlıdır:
- Bir nesnenin değişimi, diğer nesneleri de etkiliyorsa.
- Birden fazla bileşenin belirli bir nesnenin durumundan haberdar olması gerektiğinde.
- Düşük bağımlılık (loose coupling) sağlamak istendiğinde.
- Olay tabanlı sistemler veya event-driven uygulamalar geliştirildiğinde.
Observer Pattern'in Avantajları :
- Bağımsız bileşenler oluşturur: Nesneler arasındaki doğrudan bağımlılığı azaltır.
- Esneklik sağlar: Yeni gözlemciler (observers) eklemek kolaydır.
- Gerçek zamanlı bildirimleri destekler: Değişiklikler anında abonelere bildirilir.
Observer Pattern'in Dezavantajları :
- Çok fazla gözlemci olduğunda performans düşebilir.
- Bildirim yönetimi karmaşık hale gelebilir.
Observer Pattern Kullanım Biçimleri
1. Observer Arayüzü ve Subject (Gözlemlenen Nesne)
import java.util.ArrayList;
import java.util.List;
// Observer Arayüzü
interface Observer {
void update(String message);
}
// Subject (Gözlemlenen Nesne)
class Subject {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
public void removeObserver(Observer observer) {
observers.remove(observer);
}
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
2. Concrete Observer (Gerçek Gözlemciler)
// Concrete Observer
class User implements Observer {
private String name;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " bildirimi aldı: " + message);
}
}
3. Kullanım
public class Main {
public static void main(String[] args) {
Subject subject = new Subject();
Observer user1 = new User("Ahmet");
Observer user2 = new User("Mehmet");
subject.addObserver(user1);
subject.addObserver(user2);
subject.notifyObservers("Yeni bir mesaj var!");
}
}
Çıktı:
Ahmet bildirimi aldı: Yeni bir mesaj var!
Mehmet bildirimi aldı: Yeni bir mesaj var!
Gerçek Dünya Senaryosu: Hava Durumu Bildirim Sistemi
import java.util.ArrayList;
import java.util.List;
// Observer Arayüzü
interface WeatherObserver {
void update(float temperature, float humidity);
}
// Subject (Gözlemlenen Nesne)
class WeatherStation {
private List<WeatherObserver> observers = new ArrayList<>();
private float temperature;
private float humidity;
public void addObserver(WeatherObserver observer) {
observers.add(observer);
}
public void removeObserver(WeatherObserver observer) {
observers.remove(observer);
}
public void setWeather(float temperature, float humidity) {
this.temperature = temperature;
this.humidity = humidity;
notifyObservers();
}
private void notifyObservers() {
for (WeatherObserver observer : observers) {
observer.update(temperature, humidity);
}
}
}
// Concrete Observer
class WeatherDisplay implements WeatherObserver {
private String name;
public WeatherDisplay(String name) {
this.name = name;
}
@Override
public void update(float temperature, float humidity) {
System.out.println(name + " hava durumu güncellendi: Sıcaklık=" + temperature + "°C, Nem=" + humidity + "%");
}
}
// Kullanım
public class Main {
public static void main(String[] args) {
WeatherStation station = new WeatherStation();
WeatherObserver display1 = new WeatherDisplay("Ekran 1");
WeatherObserver display2 = new WeatherDisplay("Ekran 2");
station.addObserver(display1);
station.addObserver(display2);
station.setWeather(25.5f, 60.0f);
}
}
Çıktı:
Ekran 1 hava durumu güncellendi: Sıcaklık=25.5°C, Nem=60.0%
Ekran 2 hava durumu güncellendi: Sıcaklık=25.5°C, Nem=60.0%
Sonuç
Observer Design Pattern, özellikle olay tabanlı sistemlerde, bildirim mekanizmalarında ve veri değişikliklerinin takip edilmesi gereken senaryolarda yaygın olarak kullanılır. Örneğin:
- Haber ve bildirim sistemleri (E-posta abonelikleri, RSS beslemeleri)
- GUI olay dinleyicileri (Buton tıklama, klavye olayları)
- Finansal piyasa takip sistemleri (Hisse senedi fiyat güncellemeleri)
- Oyun motorları (Oyun karakteri olayları ve fizik motoru güncellemeleri)
Observer Pattern, yazılımın esnek ve ölçeklenebilir olmasını sağlayarak düşük bağımlılık prensibine katkıda bulunur.