未验证 提交 0ead283f 编写于 作者: I Ilkka Seppälä 提交者: GitHub

Merge pull request #1475 from ravening/simplify_observer

Use enums instead os switch blocks
......@@ -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
......
......@@ -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
......@@ -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");
}
}
......@@ -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");
}
}
......@@ -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() {
......
......@@ -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");
}
}
......@@ -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");
}
}
......@@ -36,10 +36,10 @@ public class HobbitsTest extends WeatherObserverTest<Hobbits> {
@Override
public Collection<Object[]> 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"});
}
/**
......
......@@ -36,10 +36,10 @@ public class OrcsTest extends WeatherObserverTest<Orcs> {
@Override
public Collection<Object[]> 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"});
}
/**
......
......@@ -38,10 +38,10 @@ public class GHobbitsTest extends ObserverTest<GHobbits> {
@Override
public Collection<Object[]> 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"}
);
}
......
......@@ -38,10 +38,10 @@ public class OrcsTest extends ObserverTest<GOrcs> {
@Override
public Collection<Object[]> 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"}
);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册