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.