From 74ad4e9f4c55cbd701b043d17f8dc916d837758b Mon Sep 17 00:00:00 2001 From: Selebrator Date: Thu, 6 Jun 2019 23:25:10 +0200 Subject: [PATCH] try to generify the observer pattern --- src/main/java/_9/_3/Ship.java | 16 +++++++++++++++- src/main/java/_9/_3/ShipEvent.java | 5 ++--- src/main/java/_9/_3/ShipLog.java | 13 +++++-------- .../java/_9/_3/{ => observer}/Observable.java | 18 ++++++++---------- src/main/java/_9/_3/observer/Observer.java | 5 +++++ src/main/java/provided/_9/Observer.java | 10 ---------- 6 files changed, 35 insertions(+), 32 deletions(-) rename src/main/java/_9/_3/{ => observer}/Observable.java (51%) create mode 100644 src/main/java/_9/_3/observer/Observer.java delete mode 100644 src/main/java/provided/_9/Observer.java diff --git a/src/main/java/_9/_3/Ship.java b/src/main/java/_9/_3/Ship.java index ded1cc7..8c036bc 100644 --- a/src/main/java/_9/_3/Ship.java +++ b/src/main/java/_9/_3/Ship.java @@ -1,6 +1,8 @@ package _9._3; -public class Ship extends Observable { +import _9._3.observer.Observable; + +public class Ship extends Observable { 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; + } } diff --git a/src/main/java/_9/_3/ShipEvent.java b/src/main/java/_9/_3/ShipEvent.java index 5d1538a..0bee347 100644 --- a/src/main/java/_9/_3/ShipEvent.java +++ b/src/main/java/_9/_3/ShipEvent.java @@ -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)]; } } diff --git a/src/main/java/_9/_3/ShipLog.java b/src/main/java/_9/_3/ShipLog.java index 0e35c8f..f72cc82 100644 --- a/src/main/java/_9/_3/ShipLog.java +++ b/src/main/java/_9/_3/ShipLog.java @@ -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 { @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; } } diff --git a/src/main/java/_9/_3/Observable.java b/src/main/java/_9/_3/observer/Observable.java similarity index 51% rename from src/main/java/_9/_3/Observable.java rename to src/main/java/_9/_3/observer/Observable.java index dbce718..2b535d4 100644 --- a/src/main/java/_9/_3/Observable.java +++ b/src/main/java/_9/_3/observer/Observable.java @@ -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 observers = new ArrayList<>(); +public abstract class Observable, What> { + private List> observers = new ArrayList<>(); private boolean changed = false; - public void addObserver(Observer o) { + public void addObserver(Observer o) { this.observers.add(o); } - public void removeObserver(Observer o) { + public void removeObserver(Observer 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 observer : observers) { + observer.update((Who) this, what); } this.clearChanged(); } diff --git a/src/main/java/_9/_3/observer/Observer.java b/src/main/java/_9/_3/observer/Observer.java new file mode 100644 index 0000000..48d6e04 --- /dev/null +++ b/src/main/java/_9/_3/observer/Observer.java @@ -0,0 +1,5 @@ +package _9._3.observer; + +public interface Observer, What> { + void update(Who who, What what); +} diff --git a/src/main/java/provided/_9/Observer.java b/src/main/java/provided/_9/Observer.java deleted file mode 100644 index 3b755d0..0000000 --- a/src/main/java/provided/_9/Observer.java +++ /dev/null @@ -1,10 +0,0 @@ -package provided._9; - -import _9._3.Observable; -import _9._3.ShipEvent; - -public interface Observer { - - void update(Observable who, ShipEvent what); - -}