Merge remote-tracking branch 'origin/master'
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…
Reference in New Issue