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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *