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