diff --git a/observer/src/main/java/com/iluwatar/App.java b/observer/src/main/java/com/iluwatar/App.java index 8beecc41b..3ed81ca96 100644 --- a/observer/src/main/java/com/iluwatar/App.java +++ b/observer/src/main/java/com/iluwatar/App.java @@ -1,5 +1,9 @@ package com.iluwatar; +import com.iluwatar.generic.GHobbits; +import com.iluwatar.generic.GOrcs; +import com.iluwatar.generic.GWeather; + /** * * Observer pattern defines one-to-many relationship between objects. The target @@ -19,5 +23,15 @@ public class App { weather.timePasses(); weather.timePasses(); + // Generic observer inspired by Java Generics and Collection by Naftalin & Wadler + GWeather gWeather = new GWeather(); + gWeather.addObserver(new GHobbits()); + gWeather.addObserver(new GOrcs()); + + gWeather.timePasses(); + gWeather.timePasses(); + gWeather.timePasses(); + gWeather.timePasses(); + } } diff --git a/observer/src/main/java/com/iluwatar/generic/GHobbits.java b/observer/src/main/java/com/iluwatar/generic/GHobbits.java new file mode 100644 index 000000000..a615ceec9 --- /dev/null +++ b/observer/src/main/java/com/iluwatar/generic/GHobbits.java @@ -0,0 +1,25 @@ +package com.iluwatar.generic; + +import com.iluwatar.WeatherType; + +public class GHobbits implements Race { + @Override + public void update(GWeather o, WeatherType weatherType) { + switch (weatherType) { + case COLD: + System.out.println("The hobbits are shivering in the cold weather."); + break; + case RAINY: + System.out.println("The hobbits look for cover from the rain."); + break; + case SUNNY: + System.out.println("The happy hobbits bade in the warm sun."); + break; + case WINDY: + System.out.println("The hobbits hold their hats tightly in the windy weather."); + break; + default: + break; + } + } +} diff --git a/observer/src/main/java/com/iluwatar/generic/GOrcs.java b/observer/src/main/java/com/iluwatar/generic/GOrcs.java new file mode 100644 index 000000000..416422c6e --- /dev/null +++ b/observer/src/main/java/com/iluwatar/generic/GOrcs.java @@ -0,0 +1,25 @@ +package com.iluwatar.generic; + +import com.iluwatar.WeatherType; + +public class GOrcs implements Race { + @Override + public void update(GWeather weather, WeatherType weatherType) { + switch (weatherType) { + case COLD: + System.out.println("The orcs are freezing cold."); + break; + case RAINY: + System.out.println("The orcs are dripping wet."); + break; + case SUNNY: + System.out.println("The sun hurts the orcs' eyes."); + break; + case WINDY: + System.out.println("The orc smell almost vanishes in the wind."); + break; + default: + break; + } + } +} diff --git a/observer/src/main/java/com/iluwatar/generic/GWeather.java b/observer/src/main/java/com/iluwatar/generic/GWeather.java new file mode 100644 index 000000000..54a608e74 --- /dev/null +++ b/observer/src/main/java/com/iluwatar/generic/GWeather.java @@ -0,0 +1,19 @@ +package com.iluwatar.generic; + +import com.iluwatar.WeatherType; + +public class GWeather extends Observable { + + private WeatherType currentWeather; + + public GWeather() { + currentWeather = WeatherType.SUNNY; + } + + public void timePasses() { + WeatherType[] enumValues = WeatherType.values(); + currentWeather = enumValues[(currentWeather.ordinal() + 1) % enumValues.length]; + System.out.println("The weather changed to " + currentWeather + "."); + notifyObservers(currentWeather); + } +} diff --git a/observer/src/main/java/com/iluwatar/generic/Observable.java b/observer/src/main/java/com/iluwatar/generic/Observable.java new file mode 100644 index 000000000..57868f97b --- /dev/null +++ b/observer/src/main/java/com/iluwatar/generic/Observable.java @@ -0,0 +1,31 @@ +package com.iluwatar.generic; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Generic observer inspired by Java Generics and Collection by Naftalin & Wadler + * + * @param Subject + * @param Observer + * @param Argument type + */ +public abstract class Observable, O extends Observer, A> { + + protected List observers; + + public Observable() { + this.observers = new CopyOnWriteArrayList<>(); + } + + public void addObserver(O observer) { + this.observers.add(observer); + } + + @SuppressWarnings("unchecked") + public void notifyObservers(A argument) { + for (O observer : observers) { + observer.update((S) this, argument); + } + } +} diff --git a/observer/src/main/java/com/iluwatar/generic/Observer.java b/observer/src/main/java/com/iluwatar/generic/Observer.java new file mode 100644 index 000000000..49bb54a7d --- /dev/null +++ b/observer/src/main/java/com/iluwatar/generic/Observer.java @@ -0,0 +1,5 @@ +package com.iluwatar.generic; + +public interface Observer, O extends Observer, A> { + public void update(S subject, A argument); +} diff --git a/observer/src/main/java/com/iluwatar/generic/Race.java b/observer/src/main/java/com/iluwatar/generic/Race.java new file mode 100644 index 000000000..1d819318e --- /dev/null +++ b/observer/src/main/java/com/iluwatar/generic/Race.java @@ -0,0 +1,6 @@ +package com.iluwatar.generic; + +import com.iluwatar.WeatherType; + +public interface Race extends Observer { +}