CodeBlanks Logo Icon CodeBlanks

Observer

Observer desenini öğrenirsin.

Observer deseni

Observer, bir nesnenin durum değişikliğini abonelerine bildirmesini sağlar. Bildirim gönderen tarafa Subject, alan tarafa Observer denir. Bu, yayınlama-abonelik (publish-subscribe) ilişkisidir.

Örnek: bir sıcaklık sensörü (Subject) değer değiştirdiğinde ekran ve günlük (Observer) bilgilendirilir. Subject, attach ile abone ekler, broadcast ile hepsine update çağrısı yapar. Aboneler istediği zaman eklenebilir; bu, sistem parçalarını birbirinden bağımsız tutar.

Kayıt ve bildirim akışı

Observer'lar attach ile bir listeye kaydedilir. Subject bir değişiklik olduğunda bu listeyi dolaşır ve her birine update çağrısı yapar. Bildirim bir dizgi ya da nesne olarak gönderilebilir.

Java'da abone listesi için genelde List<Observer> kullanılır. Çok sayıda abone varsa bildirim sırası önem kazanabilir; bu yüzden kayıt sırası korunur. Abonelikten çıkma için detach yöntemi de eklenebilir.

Uygulama Sensör abonelerini bilgilendir

Bir Observer arayüzü tanımla: void update(String msg). Screen sınıfı bu arayüzü uygulasın ve update içinde System.out.println ile "ekran: " + msg yazdırsın. Subject sınıfı attach(Observer) ve broadcast(String msg) yöntemlerini içersin; broadcast listedeki her Observer için update çağrısı yapsın. main içinde bir Screen abone ekle ve broadcast("sıcaklık 30") çağır.

Başlangıç kodu

Main.java
// Observer arayüzünü ve Screen sınıfını tanımla
// Subject sınıfına attach ekle
// main içinde broadcast çağır

Örnek çözüm

Main.java
import java.util.*;

interface Observer { void update(String msg); }

class Screen implements Observer {
    public void update(String msg) { System.out.println("ekran: " + msg); }
}

class Subject {
    private List<Observer> list = new ArrayList<>();
    public void attach(Observer o) { list.add(o); }
    public void broadcast(String msg) { for (Observer o : list) o.update(msg); }
}

public class ObserverDemo {
    public static void main(String[] args) {
        Subject s = new Subject();
        s.attach(new Screen());
        s.broadcast("sıcaklık 30");
    }
}

Beklenen çıktı

ekran: sıcaklık 30

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Observer rollerini eşleştir

Kavram Anlamı
Subject Bildirim gönderir
Observer Bildirimi alır
attach Abone ekler
update Bildirim yöntemi

2 attach çağrısını tamamla

Soru
subject.____(new Screen());
Cevap
subject.attach(new Screen());

Açıklama: attach ile yeni abone eklenir.

3 Observer deseninde aboneleri bilgilendiren taraf kimdir?

  • Observer
  • Arayüz
  • Decorator
  • Subject Doğru cevap

Açıklama: Subject, abone olan Observer'lara bildirim gönderir.

İleri seviye bölümündeki tüm dersler