try to generify the observer pattern

generic-observer
Selebrator 7 years ago
parent f2eb4a2e87
commit 74ad4e9f4c

@ -1,6 +1,8 @@
package _9._3; package _9._3;
public class Ship extends Observable { import _9._3.observer.Observable;
public class Ship extends Observable<Ship, ShipEvent> {
private boolean sailsSet = false; private boolean sailsSet = false;
private boolean cannonsLoaded = false; private boolean cannonsLoaded = false;
private int heading = 0; private int heading = 0;
@ -13,6 +15,10 @@ public class Ship extends Observable {
} }
} }
public boolean isSailsSet() {
return this.sailsSet;
}
public void strikeSails() { public void strikeSails() {
if (sailsSet) { if (sailsSet) {
sailsSet = false; sailsSet = false;
@ -37,6 +43,10 @@ public class Ship extends Observable {
} }
} }
public boolean isCannonsLoaded() {
return this.cannonsLoaded;
}
public void turnLeft() { public void turnLeft() {
heading = (heading - 90) % 180; heading = (heading - 90) % 180;
this.setChanged(); this.setChanged();
@ -48,4 +58,8 @@ public class Ship extends Observable {
this.setChanged(); this.setChanged();
notifyObservers(ShipEvent.TURN_RIGHT); notifyObservers(ShipEvent.TURN_RIGHT);
} }
public int getHeading() {
return this.heading;
}
} }

@ -1,6 +1,6 @@
package _9._3; package _9._3;
import java.util.Random; import java.util.concurrent.ThreadLocalRandom;
public enum ShipEvent { public enum ShipEvent {
@ -13,7 +13,6 @@ public enum ShipEvent {
TURN_RIGHT; TURN_RIGHT;
public static ShipEvent getRandomShipEvent() { public static ShipEvent getRandomShipEvent() {
Random random = new Random(); return values()[ThreadLocalRandom.current().nextInt(values().length)];
return values()[random.nextInt(values().length)];
} }
} }

@ -1,11 +1,10 @@
package _9._3; package _9._3;
import provided._9.Observer; import _9._3.observer.Observer;
public class ShipLog implements Observer { public class ShipLog implements Observer<Ship, ShipEvent> {
private int heading = 0;
@Override @Override
public void update(Observable who, ShipEvent what) { public void update(Ship who, ShipEvent what) {
switch (what) { switch (what) {
case SET_SAILS: case SET_SAILS:
System.out.println("Sails set."); System.out.println("Sails set.");
@ -20,12 +19,10 @@ public class ShipLog implements Observer {
System.out.println("Cannons fired."); System.out.println("Cannons fired.");
break; break;
case TURN_LEFT: case TURN_LEFT:
heading = (heading - 90) % 180; System.out.println("Turned left. New heading " + who.getHeading() + " degrees.");
System.out.println("Turned left. New heading " + heading + " degrees.");
break; break;
case TURN_RIGHT: case TURN_RIGHT:
heading = (heading + 90) % 180; System.out.println("Turned right. New heading " + who.getHeading() + " degrees.");
System.out.println("Turned right. New heading " + heading + " degrees.");
break; break;
} }
} }

@ -1,19 +1,17 @@
package _9._3; package _9._3.observer;
import provided._9.Observer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public abstract class Observable { public abstract class Observable<Who extends Observable<Who, What>, What> {
private List<Observer> observers = new ArrayList<>(); private List<Observer<Who, What>> observers = new ArrayList<>();
private boolean changed = false; private boolean changed = false;
public void addObserver(Observer o) { public void addObserver(Observer<Who, What> o) {
this.observers.add(o); this.observers.add(o);
} }
public void removeObserver(Observer o) { public void removeObserver(Observer<Who, What> o) {
this.observers.remove(o); this.observers.remove(o);
} }
@ -29,10 +27,10 @@ public abstract class Observable {
return changed; return changed;
} }
public void notifyObservers(ShipEvent what) { public void notifyObservers(What what) {
if (this.isChanged()) { if (this.isChanged()) {
for (Observer observer : observers) { for (Observer<Who, What> observer : observers) {
observer.update(this, what); observer.update((Who) this, what);
} }
this.clearChanged(); this.clearChanged();
} }

@ -0,0 +1,5 @@
package _9._3.observer;
public interface Observer<Who extends Observable<Who, What>, What> {
void update(Who who, What what);
}

@ -1,10 +0,0 @@
package provided._9;
import _9._3.Observable;
import _9._3.ShipEvent;
public interface Observer {
void update(Observable who, ShipEvent what);
}
Loading…
Cancel
Save