Java'da Observer Pattern ve EventListener: Listener Sınıfları Oluşturma Rehberi (Örneklerle)



Evet, Java'da Listener sınıflarını oluştururken Observer tasarım desenini kullanabilirsiniz. Observer tasarım deseni, bir nesnenin durumunda meydana gelen değişikliklerin, bu nesneyi gözlemleyen diğer nesnelere otomatik olarak bildirilmesini sağlar. Bu desen, birçok GUI (Grafik Kullanıcı Arayüzü) uygulamasında ve olay tabanlı sistemlerde yaygın olarak kullanılır.


Java'da Observer deseni genellikle şu iki ana bileşenden oluşur:


Subject (Gözlemlenen Nesne): Bu, durumundaki değişikliklerin diğer nesnelere bildirileceği nesnedir. Subject, kendisini gözlemleyen Observer'ları saklar ve onları yönetir. Bu, genellikle bir listeye Observer nesnelerini ekleyip çıkartarak yapılır.


Observer (Gözlemci Nesneler): Bu nesneler, Subject'in durumundaki değişiklikleri gözlemleyen ve bu değişikliklere tepki gösteren nesnelerdir. Bir Observer, genellikle Subject'in durumundaki değişiklikleri takip etmek için bir güncelleme metoduna sahiptir.


Java'da Listener sınıfları genellikle olayları dinleyen ve bu olaylara tepki gösteren nesneler olarak kullanılır. Bu nedenle, bir Listener sınıfı oluştururken Observer tasarım deseninin prensipleri uygulanabilir. Örneğin, bir GUI uygulamasında, bir düğmeye basıldığında gerçekleşecek eylemleri dinlemek için bir ActionListener kullanılabilir. Bu ActionListener, Observer deseninin bir örneği olarak düşünülebilir; burada düğme, gözlemlenen nesne (Subject) ve ActionListener, olaya tepki gösteren gözlemci (Observer) olur.


Java'nın standart kütüphanesinde Observer ve Observable sınıfları bu deseni uygulamak için kullanılabilir, ancak bu sınıflar eski ve artık kullanımdan kaldırılmıştır (deprecated). Bunun yerine, daha modern yaklaşımlar ve kendi Listener ve Event sınıflarınızı oluşturmak daha yaygındır. Java'da olay dinleyicileri ve olayları işlemek için daha özelleşmiş yapılar ve arayüzler de vardır, örneğin EventListener arayüzü ve türevleri.


Örnek bir senaryo ve java kodları verir misin?


Elbette, size basit bir Observer tasarım deseni örneği vereyim. Bu örnekte, bir Subject nesnesinin durumundaki değişiklikleri izleyen ve bu değişikliklere tepki gösteren bir Observer oluşturacağız. Bu senaryoda, WeatherStation (Hava İstasyonu) sınıfı, sıcaklık değişikliklerini izleyecek Subject olacak ve PhoneDisplay ile WindowDisplay sınıfları, bu değişikliklere tepki veren Observerlar olacak.


Önce temel arayüzlerimizi ve sınıflarımızı tanımlayalım:


java

Copy code

// Observer arayüzü

interface Observer {

    void update(float temperature);

}


// Subject arayüzü

interface Subject {

    void registerObserver(Observer o);

    void removeObserver(Observer o);

    void notifyObservers();

}


// Hava İstasyonu sınıfı

class WeatherStation implements Subject {

    private List<Observer> observers;

    private float temperature;


    public WeatherStation() {

        observers = new ArrayList<>();

    }


    public void registerObserver(Observer o) {

        observers.add(o);

    }


    public void removeObserver(Observer o) {

        observers.remove(o);

    }


    public void notifyObservers() {

        for (Observer observer : observers) {

            observer.update(temperature);

        }

    }


    public void setTemperature(float temperature) {

        this.temperature = temperature;

        notifyObservers();

    }

}


// Telefon ekranı sınıfı

class PhoneDisplay implements Observer {

    private Subject weatherStation;


    public PhoneDisplay(Subject weatherStation) {

        this.weatherStation = weatherStation;

        weatherStation.registerObserver(this);

    }


    public void update(float temperature) {

        System.out.println("Phone Display: Sıcaklık " + temperature + " derece");

    }

}


// Pencere ekranı sınıfı

class WindowDisplay implements Observer {

    private Subject weatherStation;


    public WindowDisplay(Subject weatherStation) {

        this.weatherStation = weatherStation;

        weatherStation.registerObserver(this);

    }


    public void update(float temperature) {

        System.out.println("Window Display: Sıcaklık " + temperature + " derece");

    }

}

Şimdi bu sınıfları nasıl kullanacağınıza dair bir örnek:


java

Copy code

public class Main {

    public static void main(String[] args) {

        WeatherStation weatherStation = new WeatherStation();


        PhoneDisplay phoneDisplay = new PhoneDisplay(weatherStation);

        WindowDisplay windowDisplay = new WindowDisplay(weatherStation);


        weatherStation.setTemperature(23.0f);

        weatherStation.setTemperature(26.5f);

    }

}

Bu örnekte, WeatherStation sınıfı sıcaklık değişikliklerini izler. PhoneDisplay ve WindowDisplay sınıfları, bu değişikliklere abone olur ve sıcaklık değiştiğinde güncellenirler. Sıcaklık setTemperature metodu ile değiştirildiğinde, WeatherStation sınıfı tüm kayıtlı gözlemcileri (PhoneDisplay ve WindowDisplay) bu değişiklik hakkında bilgilendirir.


Java'da olay dinleyicileri ve olayları işlemek için daha özelleşmiş yapılar ve arayüzler de vardır, örneğin EventListener arayüzü ve türevleri. Aynı örneği Java kod örneği vererek bu şekilde yapar mısın?


Tabii ki, Java'da olay dinleyicileri ve olayları işlemek için özelleşmiş yapıları kullanarak aynı senaryoyu uygulayalım. Bu örnekte, özel bir olay sınıfı ve bu olayı dinleyecek dinleyiciler oluşturacağız. Java'da GUI (Grafik Kullanıcı Arayüzü) uygulamaları için yaygın olan bu yaklaşım, Swing kütüphanesindeki olay işleme mekanizmasına benzerdir.


Öncelikle, bir olay sınıfı (TemperatureEvent) ve bir olay dinleyici arayüzü (TemperatureListener) oluşturalım:


java

Copy code

// TemperatureEvent sınıfı

class TemperatureEvent extends EventObject {

    private float temperature;


    public TemperatureEvent(Object source, float temperature) {

        super(source);

        this.temperature = temperature;

    }


    public float getTemperature() {

        return temperature;

    }

}


// TemperatureListener arayüzü

interface TemperatureListener extends EventListener {

    void temperatureChanged(TemperatureEvent event);

}

Şimdi WeatherStation sınıfını bu olayları tetikleyecek şekilde güncelleyelim:


java

Copy code

class WeatherStation {

    private float temperature;

    private List<TemperatureListener> listeners;


    public WeatherStation() {

        listeners = new ArrayList<>();

    }


    public void addTemperatureListener(TemperatureListener listener) {

        listeners.add(listener);

    }


    public void removeTemperatureListener(TemperatureListener listener) {

        listeners.remove(listener);

    }


    protected void notifyTemperatureChanged() {

        TemperatureEvent event = new TemperatureEvent(this, temperature);

        for (TemperatureListener listener : listeners) {

            listener.temperatureChanged(event);

        }

    }


    public void setTemperature(float temperature) {

        this.temperature = temperature;

        notifyTemperatureChanged();

    }

}

Son olarak, PhoneDisplay ve WindowDisplay sınıflarını TemperatureListener'ı uygulayacak şekilde güncelleyelim:


java

Copy code

class PhoneDisplay implements TemperatureListener {

    public void temperatureChanged(TemperatureEvent event) {

        System.out.println("Phone Display: Sıcaklık " + event.getTemperature() + " derece");

    }

}


class WindowDisplay implements TemperatureListener {

    public void temperatureChanged(TemperatureEvent event) {

        System.out.println("Window Display: Sıcaklık " + event.getTemperature() + " derece");

    }

}

Bu yapıları nasıl kullanacağınıza dair bir örnek:


java

Copy code

public class Main {

    public static void main(String[] args) {

        WeatherStation weatherStation = new WeatherStation();


        PhoneDisplay phoneDisplay = new PhoneDisplay();

        WindowDisplay windowDisplay = new WindowDisplay();


        weatherStation.addTemperatureListener(phoneDisplay);

        weatherStation.addTemperatureListener(windowDisplay);


        weatherStation.setTemperature(23.0f);

        weatherStation.setTemperature(26.5f);

    }

}

Bu örnekte, WeatherStation sınıfı, sıcaklık değiştiğinde bir TemperatureEvent olayını tetikler ve kayıtlı tüm TemperatureListenerları bu olay hakkında bilgilendirir. PhoneDisplay ve WindowDisplay, bu olaylara tepki veren dinleyicilerdir. Bu yaklaşım, Java'da olay tabanlı programlama için daha özelleşmiş bir yapı sağlar ve GUI uygulamalarında yaygın olarak kullanılır.

Please Select Embedded Mode To Show The Comment System.*

Daha yeni Daha eski

نموذج الاتصال