Merge remote-tracking branch 'origin/master'

generic-observer
Selebrator 7 years ago
commit f2eb4a2e87

@ -0,0 +1,37 @@
package _9._3;
import provided._9.Captain;
public class DrunkenPirate extends Captain {
public DrunkenPirate(Ship ship) {
super(ship);
}
@Override
public void commandShip() {
ShipEvent event = ShipEvent.getRandomShipEvent();
System.out.println(event);
switch (event) {
case SET_SAILS:
this.ship.setSails();
break;
case STRIKE_SAILS:
this.ship.strikeSails();
break;
case LOAD_CANNONS:
this.ship.loadCannons();
break;
case FIRE_CANNONS:
this.ship.fireCannons();
break;
case TURN_LEFT:
this.ship.turnLeft();
break;
case TURN_RIGHT:
this.ship.turnRight();
break;
}
}
}

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

@ -0,0 +1,51 @@
package _9._3;
public class Ship extends Observable {
private boolean sailsSet = false;
private boolean cannonsLoaded = false;
private int heading = 0;
public void setSails() {
if (!sailsSet) {
sailsSet = true;
this.setChanged();
notifyObservers(ShipEvent.SET_SAILS);
}
}
public void strikeSails() {
if (sailsSet) {
sailsSet = false;
this.setChanged();
notifyObservers(ShipEvent.STRIKE_SAILS);
}
}
public void loadCannons() {
if (!cannonsLoaded) {
cannonsLoaded = true;
this.setChanged();
notifyObservers(ShipEvent.LOAD_CANNONS);
}
}
public void fireCannons() {
if (cannonsLoaded) {
cannonsLoaded = false;
this.setChanged();
notifyObservers(ShipEvent.FIRE_CANNONS);
}
}
public void turnLeft() {
heading = (heading - 90) % 180;
this.setChanged();
notifyObservers(ShipEvent.TURN_LEFT);
}
public void turnRight() {
heading = (heading + 90) % 360;
this.setChanged();
notifyObservers(ShipEvent.TURN_RIGHT);
}
}

@ -0,0 +1,19 @@
package _9._3;
import java.util.Random;
public enum ShipEvent {
NO_EVENT,
SET_SAILS,
STRIKE_SAILS,
LOAD_CANNONS,
FIRE_CANNONS,
TURN_LEFT,
TURN_RIGHT;
public static ShipEvent getRandomShipEvent() {
Random random = new Random();
return values()[random.nextInt(values().length)];
}
}

@ -0,0 +1,32 @@
package _9._3;
import provided._9.Observer;
public class ShipLog implements Observer {
private int heading = 0;
@Override
public void update(Observable who, ShipEvent what) {
switch (what) {
case SET_SAILS:
System.out.println("Sails set.");
break;
case STRIKE_SAILS:
System.out.println("Sails struck.");
break;
case LOAD_CANNONS:
System.out.println("Cannons loaded.");
break;
case FIRE_CANNONS:
System.out.println("Cannons fired.");
break;
case TURN_LEFT:
heading = (heading - 90) % 180;
System.out.println("Turned left. New heading " + heading + " degrees.");
break;
case TURN_RIGHT:
heading = (heading + 90) % 180;
System.out.println("Turned right. New heading " + heading + " degrees.");
break;
}
}
}

@ -0,0 +1,22 @@
package provided._9;
import _9._3.Ship;
public abstract class Captain {
protected Ship ship;
public Captain(Ship ship) {
super();
this.ship = ship;
}
/**
* Gibt ein Kommando an das Schiff.
* Dieses Kommando wird erst auf der Konsole ausgegeben
* und anschliessend wird die entsprechende Methode des
* Schiffs aufgerufen.
*/
public abstract void commandShip();
}

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

@ -0,0 +1,20 @@
package provided._9;
import _9._3.DrunkenPirate;
import _9._3.Ship;
import _9._3.ShipLog;
public class ShipTest {
private static final int MAX_COMMANDS = 50;
public static void main(String[] args) {
Ship blackPearl = new Ship();
blackPearl.addObserver(new ShipLog());
Captain sparrow = new DrunkenPirate(blackPearl);
for (int i = 0; i < MAX_COMMANDS; i++) {
sparrow.commandShip();
}
}
}
Loading…
Cancel
Save