diff --git a/observer/README.md b/observer/README.md index e329a657c..e4b3cea76 100644 --- a/observer/README.md +++ b/observer/README.md @@ -13,18 +13,18 @@ tags: Dependents, Publish-Subscribe ## Intent -Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified +Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically. ## Explanation Real world example -> In a land far away lives the races of hobbits and orcs. Both of them are mostly outdoors so they closely follow the changes in weather. One could say that they are constantly observing the weather. +> In a land far away lives the races of hobbits and orcs. Both of them are mostly outdoors so they closely follow the changes in weather. One could say that they are constantly observing the weather. In plain words -> Register as an observer to receive state changes in the object. +> Register as an observer to receive state changes in the object. Wikipedia says @@ -46,22 +46,7 @@ public class Orcs implements WeatherObserver { @Override public void update(WeatherType currentWeather) { - switch (currentWeather) { - case COLD: - LOGGER.info("The orcs are freezing cold."); - break; - case RAINY: - LOGGER.info("The orcs are dripping wet."); - break; - case SUNNY: - LOGGER.info("The sun hurts the orcs' eyes."); - break; - case WINDY: - LOGGER.info("The orc smell almost vanishes in the wind."); - break; - default: - break; - } + LOGGER.info("The hobbits are facing " + currentWeather.getDescription() + " weather now"); } } @@ -72,21 +57,7 @@ public class Hobbits implements WeatherObserver { @Override public void update(WeatherType currentWeather) { switch (currentWeather) { - case COLD: - LOGGER.info("The hobbits are shivering in the cold weather."); - break; - case RAINY: - LOGGER.info("The hobbits look for cover from the rain."); - break; - case SUNNY: - LOGGER.info("The happy hobbits bade in the warm sun."); - break; - case WINDY: - LOGGER.info("The hobbits hold their hats tightly in the windy weather."); - break; - default: - break; - } + LOGGER.info("The hobbits are facing " + currentWeather.getDescription() + " weather now"); } } ``` @@ -141,20 +112,20 @@ Here's the full example in action. weather.timePasses(); // The weather changed to rainy. - // The orcs are dripping wet. - // The hobbits look for cover from the rain. + // The orcs are facing rainy weather now + // The hobbits are facing rainy weather now weather.timePasses(); // The weather changed to windy. - // The orc smell almost vanishes in the wind. - // The hobbits hold their hats tightly in the windy weather. + // The orcs are facing windy weather now + // The hobbits are facing windy weather now weather.timePasses(); // The weather changed to cold. - // The orcs are freezing cold. - // The hobbits are shivering in the cold weather. + // The orcs are facing cold weather now + // The hobbits are facing cold weather now weather.timePasses(); // The weather changed to sunny. - // The sun hurts the orcs' eyes. - // The happy hobbits bade in the warm sun. + // The orcs are facing sunny weather now + // The hobbits are facing sunny weather now ``` ## Class diagram diff --git a/observer/etc/observer.urm.puml b/observer/etc/observer.urm.puml index bea9aab53..497ef5fde 100644 --- a/observer/etc/observer.urm.puml +++ b/observer/etc/observer.urm.puml @@ -33,7 +33,9 @@ package com.iluwatar.observer { + RAINY {static} + SUNNY {static} + WINDY {static} + + description String + toString() : String + + getDescription() : String + valueOf(name : String) : WeatherType {static} + values() : WeatherType[] {static} } @@ -71,10 +73,10 @@ package com.iluwatar.observer.generic { Weather --> "-currentWeather" WeatherType GWeather --> "-currentWeather" WeatherType Weather --> "-observers" WeatherObserver -Hobbits ..|> WeatherObserver -Orcs ..|> WeatherObserver -GHobbits ..|> Race -GOrcs ..|> Race -GWeather --|> Observable -Race --|> Observer -@enduml \ No newline at end of file +Hobbits ..|> WeatherObserver +Orcs ..|> WeatherObserver +GHobbits ..|> Race +GOrcs ..|> Race +GWeather --|> Observable +Race --|> Observer +@enduml diff --git a/observer/etc/observer_with_generics.png b/observer/etc/observer_with_generics.png new file mode 100644 index 000000000..06ff0d9cc Binary files /dev/null and b/observer/etc/observer_with_generics.png differ diff --git a/observer/src/main/java/com/iluwatar/observer/Hobbits.java b/observer/src/main/java/com/iluwatar/observer/Hobbits.java index 646ceebfd..5894c93a6 100644 --- a/observer/src/main/java/com/iluwatar/observer/Hobbits.java +++ b/observer/src/main/java/com/iluwatar/observer/Hobbits.java @@ -35,21 +35,6 @@ public class Hobbits implements WeatherObserver { @Override public void update(WeatherType currentWeather) { - switch (currentWeather) { - case COLD: - LOGGER.info("The hobbits are shivering in the cold weather."); - break; - case RAINY: - LOGGER.info("The hobbits look for cover from the rain."); - break; - case SUNNY: - LOGGER.info("The happy hobbits bade in the warm sun."); - break; - case WINDY: - LOGGER.info("The hobbits hold their hats tightly in the windy weather."); - break; - default: - break; - } + LOGGER.info("The hobbits are facing " + currentWeather.getDescription() + " weather now"); } } diff --git a/observer/src/main/java/com/iluwatar/observer/Orcs.java b/observer/src/main/java/com/iluwatar/observer/Orcs.java index a28ffbc5b..1a955aafd 100644 --- a/observer/src/main/java/com/iluwatar/observer/Orcs.java +++ b/observer/src/main/java/com/iluwatar/observer/Orcs.java @@ -35,21 +35,6 @@ public class Orcs implements WeatherObserver { @Override public void update(WeatherType currentWeather) { - switch (currentWeather) { - case COLD: - LOGGER.info("The orcs are freezing cold."); - break; - case RAINY: - LOGGER.info("The orcs are dripping wet."); - break; - case SUNNY: - LOGGER.info("The sun hurts the orcs' eyes."); - break; - case WINDY: - LOGGER.info("The orc smell almost vanishes in the wind."); - break; - default: - break; - } + LOGGER.info("The orcs are facing " + currentWeather.getDescription() + " weather now"); } } diff --git a/observer/src/main/java/com/iluwatar/observer/WeatherType.java b/observer/src/main/java/com/iluwatar/observer/WeatherType.java index 75ee17d60..e11317c21 100644 --- a/observer/src/main/java/com/iluwatar/observer/WeatherType.java +++ b/observer/src/main/java/com/iluwatar/observer/WeatherType.java @@ -28,7 +28,20 @@ package com.iluwatar.observer; */ public enum WeatherType { - SUNNY, RAINY, WINDY, COLD; + SUNNY("Sunny"), + RAINY("Rainy"), + WINDY("Windy"), + COLD("Cold"); + + private final String description; + + WeatherType(String description) { + this.description = description; + } + + public String getDescription() { + return this.description; + } @Override public String toString() { diff --git a/observer/src/main/java/com/iluwatar/observer/generic/GHobbits.java b/observer/src/main/java/com/iluwatar/observer/generic/GHobbits.java index 7a555d850..90fd4e300 100644 --- a/observer/src/main/java/com/iluwatar/observer/generic/GHobbits.java +++ b/observer/src/main/java/com/iluwatar/observer/generic/GHobbits.java @@ -36,21 +36,6 @@ public class GHobbits implements Race { @Override public void update(GWeather weather, WeatherType weatherType) { - switch (weatherType) { - case COLD: - LOGGER.info("The hobbits are shivering in the cold weather."); - break; - case RAINY: - LOGGER.info("The hobbits look for cover from the rain."); - break; - case SUNNY: - LOGGER.info("The happy hobbits bade in the warm sun."); - break; - case WINDY: - LOGGER.info("The hobbits hold their hats tightly in the windy weather."); - break; - default: - break; - } + LOGGER.info("The hobbits are facing " + weatherType.getDescription() + " weather now"); } } diff --git a/observer/src/main/java/com/iluwatar/observer/generic/GOrcs.java b/observer/src/main/java/com/iluwatar/observer/generic/GOrcs.java index d9adbf116..bc49c4e30 100644 --- a/observer/src/main/java/com/iluwatar/observer/generic/GOrcs.java +++ b/observer/src/main/java/com/iluwatar/observer/generic/GOrcs.java @@ -36,21 +36,6 @@ public class GOrcs implements Race { @Override public void update(GWeather weather, WeatherType weatherType) { - switch (weatherType) { - case COLD: - LOGGER.info("The orcs are freezing cold."); - break; - case RAINY: - LOGGER.info("The orcs are dripping wet."); - break; - case SUNNY: - LOGGER.info("The sun hurts the orcs' eyes."); - break; - case WINDY: - LOGGER.info("The orc smell almost vanishes in the wind."); - break; - default: - break; - } + LOGGER.info("The orcs are facing " + weatherType.getDescription() + " weather now"); } } diff --git a/observer/src/test/java/com/iluwatar/observer/HobbitsTest.java b/observer/src/test/java/com/iluwatar/observer/HobbitsTest.java index 66ec45fdb..345b8e331 100644 --- a/observer/src/test/java/com/iluwatar/observer/HobbitsTest.java +++ b/observer/src/test/java/com/iluwatar/observer/HobbitsTest.java @@ -36,10 +36,10 @@ public class HobbitsTest extends WeatherObserverTest { @Override public Collection dataProvider() { return List.of( - new Object[]{WeatherType.SUNNY, "The happy hobbits bade in the warm sun."}, - new Object[]{WeatherType.RAINY, "The hobbits look for cover from the rain."}, - new Object[]{WeatherType.WINDY, "The hobbits hold their hats tightly in the windy weather."}, - new Object[]{WeatherType.COLD, "The hobbits are shivering in the cold weather."}); + new Object[]{WeatherType.SUNNY, "The hobbits are facing Sunny weather now"}, + new Object[]{WeatherType.RAINY, "The hobbits are facing Rainy weather now"}, + new Object[]{WeatherType.WINDY, "The hobbits are facing Windy weather now"}, + new Object[]{WeatherType.COLD, "The hobbits are facing Cold weather now"}); } /** diff --git a/observer/src/test/java/com/iluwatar/observer/OrcsTest.java b/observer/src/test/java/com/iluwatar/observer/OrcsTest.java index ff615df3c..65beeaf0e 100644 --- a/observer/src/test/java/com/iluwatar/observer/OrcsTest.java +++ b/observer/src/test/java/com/iluwatar/observer/OrcsTest.java @@ -36,10 +36,10 @@ public class OrcsTest extends WeatherObserverTest { @Override public Collection dataProvider() { return List.of( - new Object[]{WeatherType.SUNNY, "The sun hurts the orcs' eyes."}, - new Object[]{WeatherType.RAINY, "The orcs are dripping wet."}, - new Object[]{WeatherType.WINDY, "The orc smell almost vanishes in the wind."}, - new Object[]{WeatherType.COLD, "The orcs are freezing cold."}); + new Object[]{WeatherType.SUNNY, "The orcs are facing Sunny weather now"}, + new Object[]{WeatherType.RAINY, "The orcs are facing Rainy weather now"}, + new Object[]{WeatherType.WINDY, "The orcs are facing Windy weather now"}, + new Object[]{WeatherType.COLD, "The orcs are facing Cold weather now"}); } /** diff --git a/observer/src/test/java/com/iluwatar/observer/generic/GHobbitsTest.java b/observer/src/test/java/com/iluwatar/observer/generic/GHobbitsTest.java index dd0e6d6bf..756d72239 100644 --- a/observer/src/test/java/com/iluwatar/observer/generic/GHobbitsTest.java +++ b/observer/src/test/java/com/iluwatar/observer/generic/GHobbitsTest.java @@ -38,10 +38,10 @@ public class GHobbitsTest extends ObserverTest { @Override public Collection dataProvider() { return List.of( - new Object[]{WeatherType.SUNNY, "The happy hobbits bade in the warm sun."}, - new Object[]{WeatherType.RAINY, "The hobbits look for cover from the rain."}, - new Object[]{WeatherType.WINDY, "The hobbits hold their hats tightly in the windy weather."}, - new Object[]{WeatherType.COLD, "The hobbits are shivering in the cold weather."} + new Object[]{WeatherType.SUNNY, "The hobbits are facing Sunny weather now"}, + new Object[]{WeatherType.RAINY, "The hobbits are facing Rainy weather now"}, + new Object[]{WeatherType.WINDY, "The hobbits are facing Windy weather now"}, + new Object[]{WeatherType.COLD, "The hobbits are facing Cold weather now"} ); } diff --git a/observer/src/test/java/com/iluwatar/observer/generic/OrcsTest.java b/observer/src/test/java/com/iluwatar/observer/generic/OrcsTest.java index 396de4456..523678288 100644 --- a/observer/src/test/java/com/iluwatar/observer/generic/OrcsTest.java +++ b/observer/src/test/java/com/iluwatar/observer/generic/OrcsTest.java @@ -38,10 +38,10 @@ public class OrcsTest extends ObserverTest { @Override public Collection dataProvider() { return List.of( - new Object[]{WeatherType.SUNNY, "The sun hurts the orcs' eyes."}, - new Object[]{WeatherType.RAINY, "The orcs are dripping wet."}, - new Object[]{WeatherType.WINDY, "The orc smell almost vanishes in the wind."}, - new Object[]{WeatherType.COLD, "The orcs are freezing cold."} + new Object[]{WeatherType.SUNNY, "The orcs are facing Sunny weather now"}, + new Object[]{WeatherType.RAINY, "The orcs are facing Rainy weather now"}, + new Object[]{WeatherType.WINDY, "The orcs are facing Windy weather now"}, + new Object[]{WeatherType.COLD, "The orcs are facing Cold weather now"} ); }