try to generify the observer pattern

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

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

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

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

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