diff --git a/observer/pom.xml b/observer/pom.xml
new file mode 100644
index 000000000..00099809a
--- /dev/null
+++ b/observer/pom.xml
@@ -0,0 +1,23 @@
+
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.0-SNAPSHOT
+
+ com.iluwatar
+ observer
+ 1.0-SNAPSHOT
+ observer
+ http://maven.apache.org
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/observer/src/main/java/com/iluwatar/App.java b/observer/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..9f59473d5
--- /dev/null
+++ b/observer/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,18 @@
+package com.iluwatar;
+
+public class App
+{
+ public static void main( String[] args )
+ {
+
+ Weather weather = new Weather();
+ weather.addObserver(new Orcs());
+ weather.addObserver(new Hobbits());
+
+ weather.timePasses();
+ weather.timePasses();
+ weather.timePasses();
+ weather.timePasses();
+
+ }
+}
diff --git a/observer/src/main/java/com/iluwatar/Hobbits.java b/observer/src/main/java/com/iluwatar/Hobbits.java
new file mode 100644
index 000000000..b4b09ab3c
--- /dev/null
+++ b/observer/src/main/java/com/iluwatar/Hobbits.java
@@ -0,0 +1,25 @@
+package com.iluwatar;
+
+public class Hobbits implements WeatherObserver {
+
+ @Override
+ public void update(WeatherType currentWeather) {
+ switch (currentWeather) {
+ 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/Orcs.java b/observer/src/main/java/com/iluwatar/Orcs.java
new file mode 100644
index 000000000..05fc0a4c9
--- /dev/null
+++ b/observer/src/main/java/com/iluwatar/Orcs.java
@@ -0,0 +1,25 @@
+package com.iluwatar;
+
+public class Orcs implements WeatherObserver {
+
+ @Override
+ public void update(WeatherType currentWeather) {
+ switch (currentWeather) {
+ 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/Weather.java b/observer/src/main/java/com/iluwatar/Weather.java
new file mode 100644
index 000000000..cc43fa6c7
--- /dev/null
+++ b/observer/src/main/java/com/iluwatar/Weather.java
@@ -0,0 +1,50 @@
+package com.iluwatar;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class Weather {
+
+ private WeatherType currentWeather;
+ private List observers;
+
+ public Weather() {
+ observers = new ArrayList<>();
+ currentWeather = WeatherType.SUNNY;
+ }
+
+ public void addObserver(WeatherObserver obs) {
+ observers.add(obs);
+ }
+
+ public void removeObserver(WeatherObserver obs) {
+ observers.remove(obs);
+ }
+
+ public void timePasses() {
+ switch (currentWeather) {
+ case COLD:
+ currentWeather = WeatherType.SUNNY;
+ break;
+ case RAINY:
+ currentWeather = WeatherType.WINDY;
+ break;
+ case SUNNY:
+ currentWeather = WeatherType.RAINY;
+ break;
+ case WINDY:
+ currentWeather = WeatherType.COLD;
+ break;
+ default:
+ break;
+ }
+ System.out.println("The weather now changes to " + currentWeather);
+ notifyObservers();
+ }
+
+ private void notifyObservers() {
+ for (WeatherObserver obs: observers) {
+ obs.update(currentWeather);
+ }
+ }
+}
diff --git a/observer/src/main/java/com/iluwatar/WeatherObserver.java b/observer/src/main/java/com/iluwatar/WeatherObserver.java
new file mode 100644
index 000000000..ac4e1c8a5
--- /dev/null
+++ b/observer/src/main/java/com/iluwatar/WeatherObserver.java
@@ -0,0 +1,7 @@
+package com.iluwatar;
+
+public interface WeatherObserver {
+
+ void update(WeatherType currentWeather);
+
+}
diff --git a/observer/src/main/java/com/iluwatar/WeatherType.java b/observer/src/main/java/com/iluwatar/WeatherType.java
new file mode 100644
index 000000000..9625fbab8
--- /dev/null
+++ b/observer/src/main/java/com/iluwatar/WeatherType.java
@@ -0,0 +1,14 @@
+package com.iluwatar;
+
+public enum WeatherType {
+
+ SUNNY,
+ RAINY,
+ WINDY,
+ COLD;
+
+ public String toString() {
+ return this.name().toLowerCase();
+ };
+
+}
diff --git a/pom.xml b/pom.xml
index 50debda49..f42bd9b06 100644
--- a/pom.xml
+++ b/pom.xml
@@ -36,6 +36,7 @@
iterator
mediator
memento
+ observer