Wzorzec projektowy Observer w Java

Wzorzec projektowy Observer umożliwia obiektom subskrybowanie i reagowanie na zdarzenia występujące w innym obiekcie. Jest szeroko stosowany w programowaniu do implementacji mechanizmu słuchaczy i zdarzeń, co ułatwia tworzenie luźno powiązanych systemów. W Javie wzorzec ten jest często wykorzystywany do tworzenia aplikacji z interfejsem graficznym, ale jego zastosowanie jest znacznie szersze.

Przykład użycia wzorca Observer

W tym przykładzie stworzymy prosty system powiadomień o zmianie temperatury, gdzie WeatherStation (Stacja Pogodowa) będzie obiektem obserwowanym, a PhoneDisplay i WindowDisplay będą obserwatorami.

Krok 1: Interfejs Observer i Subject

Najpierw zdefiniujemy interfejsy dla obserwatorów (Observer) i dla obiektu obserwowanego (Subject).

// Interfejs Observer
public interface Observer {
    void update(float temperature);
}

// Interfejs Subject
public interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}
Krok 2: Implementacja Subject

Klasa WeatherStation implementuje interfejs Subject i przechowuje temperaturę, informując obserwatorów o jej zmianach.

import java.util.ArrayList;
import java.util.List;

public class WeatherStation implements Subject {
    private List<Observer> observers;
    private float temperature;

    public WeatherStation() {
        observers = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer o) {
        observers.add(o);
    }

    @Override
    public void removeObserver(Observer o) {
        observers.remove(o);
    }

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(temperature);
        }
    }

    public void setTemperature(float temperature) {
        this.temperature = temperature;
        notifyObservers();
    }
}
Krok 3: Implementacja Observer

Teraz zaimplementujemy dwa typy obserwatorów: PhoneDisplay i WindowDisplay, które odbierają aktualizacje temperatury.

// PhoneDisplay obserwator
public class PhoneDisplay implements Observer {
    private Subject weatherStation;

    public PhoneDisplay(Subject weatherStation) {
        this.weatherStation = weatherStation;
        weatherStation.registerObserver(this);
    }

    @Override
    public void update(float temperature) {
        System.out.println("Aktualna temperatura" 
               + " na telefonie: " + temperature + "°C");
    }
}

// WindowDisplay obserwator
public class WindowDisplay implements Observer {
    private Subject weatherStation;

    public WindowDisplay(Subject weatherStation) {
        this.weatherStation = weatherStation;
        weatherStation.registerObserver(this);
    }

    @Override
    public void update(float temperature) {
        System.out.println("Aktualna temperatura na "  
             + " wyświetlaczu okiennym: " + temperature + "°C");
    }
}
Krok 4: Demonstracja działania

Demonstracja użycia naszego systemu w klasie Main.

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.5f);
    }
}

Podsumowanie

Wzorzec projektowy Observer w Javie umożliwia efektywne zarządzanie zależnościami między obiektami przy minimalnym sprzężeniu. Dzięki temu wzorcowi, obiekty mogą obserwować i reagować na zdarzenia w innych obiektach, co jest szczególnie przydatne w aplikacjach reagujących na zmiany stanu. Implementacja tego wzorca może znacznie ułatwić tworzenie rozszerzalnych i łatwych w utrzymaniu aplikacji.

Jeżeli chcesz przyśpieszyć swoją naukę tworzenia stron chciałbym polecić mój kurs video Java w którym nauczysz się tego języka od podstaw do zaawansowanych jego aspektów.

Scroll to Top