Wzorzec projektowy Observer

Observer = obserwator.
Interfejs Observer i klasa Observable zostały oznaczone klauzulą deprecated.

Zadanie programistyczne

Utworzyć smoka szpiega zbierajacego informacje o lokalizacji obcego wojska i
przekazującego informacje o ich położeniu i liczbie do centrali przejmujacej
dane.

Rozwiązanie

Klasy

Klasa Centrala
package observer;
interface Centrala {
    void update(float x, float y, int liczbaSmokow);
}
Klasa Centrala Observacyjna
package observer;
public class CentralaObserwacyjna implements Centrala {
    @Override
    public void update(float x, float y, int liczbaSmokow) {
        System.out.println("Lokalizacja wrogów poz. " + x + ", " + y + ". Razem " + liczbaSmokow + " smoków");
    }
}
Klasa SmokSzpieg
package observer;
interface SmokSzpieg {
    void registerObserver(Centrala o);
    void removeObserver(Centrala o);
    void notifyObservers();
}
Klasa SmokSzpiegWojskowy
package observer;
import java.util.*;
public class SmokSzpiegWojskowy implements SmokSzpieg {
    private final ArrayList<Centrala> obserwatorzy;
    private float x;
    private float y;
    private int liczbaSmokow;
    public SmokSzpiegWojskowy() {
        obserwatorzy = new ArrayList<>();
    }
    @Override
    public void registerObserver(Centrala o) {
        obserwatorzy.add(o);
    }
    @Override
    public void removeObserver(Centrala o) {
        int i = obserwatorzy.indexOf(o);
        if (i >= 0) {
            obserwatorzy.remove(i);
        }
    }
    @Override
    public void notifyObservers() {
        for (Centrala observer : obserwatorzy) {
            observer.update(x, y, liczbaSmokow);
        }
    }
    private void valueHasChanged() {
        notifyObservers();
    }
    public void setValues(float x, float y, int liczbaSmokow) {
        this.x = x;
        this.y = y;
        this.liczbaSmokow = liczbaSmokow;
        valueHasChanged();
    }
    public float getX() {
        return x;
    }
    public void setX(float x) {
        this.x = x;
        valueHasChanged();
    }
    public float getY() {
        return y;
    }
    public void setY(float y) {
        this.y = y;
        valueHasChanged();
    }
    public int getLiczbaSmokow() {
        return liczbaSmokow;
    }
    public void setLiczbaSmokow(int liczbaSmokow) {
        this.liczbaSmokow = liczbaSmokow;
        valueHasChanged();
    }
}
Klasa Main
package observer;
class Main {
    public static void main(String[] args) {
        SmokSzpiegWojskowy szpieg = new SmokSzpiegWojskowy();
        CentralaObserwacyjna centrala = new CentralaObserwacyjna();
        szpieg.registerObserver(centrala);
        szpieg.setValues(30.0f, 70.0f, 175);
        szpieg.setLiczbaSmokow(300);
        szpieg.setX(35.5f);
    }
}

Wynik

Lokalizacja wrogów poz. 30.0, 70.0. Razem 175 smoków
Lokalizacja wrogów poz. 30.0, 70.0. Razem 300 smoków
Lokalizacja wrogów poz. 35.5, 70.0. Razem 300 smoków