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