From cb40f1cdbd56ed7ecc8e790bf9abaaa84a5a48ef Mon Sep 17 00:00:00 2001 From: Jon Ingi Sveinbjornsson Date: Tue, 11 Nov 2014 23:15:13 +0000 Subject: [PATCH 1/3] Added example of generic observer --- observer/src/main/java/com/iluwatar/App.java | 14 +++++++++ .../java/com/iluwatar/generic/GHobbits.java | 25 +++++++++++++++ .../main/java/com/iluwatar/generic/GOrcs.java | 25 +++++++++++++++ .../java/com/iluwatar/generic/GWeather.java | 19 ++++++++++++ .../java/com/iluwatar/generic/Observable.java | 31 +++++++++++++++++++ .../java/com/iluwatar/generic/Observer.java | 5 +++ .../main/java/com/iluwatar/generic/Race.java | 6 ++++ 7 files changed, 125 insertions(+) create mode 100644 observer/src/main/java/com/iluwatar/generic/GHobbits.java create mode 100644 observer/src/main/java/com/iluwatar/generic/GOrcs.java create mode 100644 observer/src/main/java/com/iluwatar/generic/GWeather.java create mode 100644 observer/src/main/java/com/iluwatar/generic/Observable.java create mode 100644 observer/src/main/java/com/iluwatar/generic/Observer.java create mode 100644 observer/src/main/java/com/iluwatar/generic/Race.java 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 { +} From 6b4e1c32bcdd10162849b40d17abd942236beeaa Mon Sep 17 00:00:00 2001 From: Jon Ingi Sveinbjornsson Date: Tue, 11 Nov 2014 23:23:08 +0000 Subject: [PATCH 2/3] Added message to observer app --- observer/src/main/java/com/iluwatar/App.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/observer/src/main/java/com/iluwatar/App.java b/observer/src/main/java/com/iluwatar/App.java index 3ed81ca96..0cf5bb117 100644 --- a/observer/src/main/java/com/iluwatar/App.java +++ b/observer/src/main/java/com/iluwatar/App.java @@ -24,9 +24,10 @@ public class App { weather.timePasses(); // Generic observer inspired by Java Generics and Collection by Naftalin & Wadler + System.out.println("\n--Running generic version--"); GWeather gWeather = new GWeather(); - gWeather.addObserver(new GHobbits()); gWeather.addObserver(new GOrcs()); + gWeather.addObserver(new GHobbits()); gWeather.timePasses(); gWeather.timePasses(); From b15b96cdc2614afd94cb5d0eedddbc204ec42fad Mon Sep 17 00:00:00 2001 From: Jon Ingi Sveinbjornsson Date: Wed, 12 Nov 2014 10:47:41 +0000 Subject: [PATCH 3/3] Added Java Generics and Collections to credits of readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index df9224888..3f5b0961a 100644 --- a/README.md +++ b/README.md @@ -323,6 +323,7 @@ The difference is the intent of the patterns. While Proxy controls access to the * [Design Patterns: Elements of Reusable Object-Oriented Software](http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612) * [Effective Java (2nd Edition)](http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683) +* [Java Generics and Collections](http://www.amazon.com/Java-Generics-Collections-Maurice-Naftalin/dp/0596527756/)