diff --git a/event-aggregator/etc/classes.png b/event-aggregator/etc/classes.png
new file mode 100644
index 000000000..295719ea3
Binary files /dev/null and b/event-aggregator/etc/classes.png differ
diff --git a/event-aggregator/etc/classes.ucls b/event-aggregator/etc/classes.ucls
new file mode 100644
index 000000000..4a869b9d2
--- /dev/null
+++ b/event-aggregator/etc/classes.ucls
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/event-aggregator/pom.xml b/event-aggregator/pom.xml
new file mode 100644
index 000000000..9392bd996
--- /dev/null
+++ b/event-aggregator/pom.xml
@@ -0,0 +1,17 @@
+
+ 4.0.0
+
+ com.iluwatar
+ java-design-patterns
+ 1.0-SNAPSHOT
+
+ event-aggregator
+
+
+ junit
+ junit
+ test
+
+
+
diff --git a/event-aggregator/src/main/java/com/iluwatar/App.java b/event-aggregator/src/main/java/com/iluwatar/App.java
new file mode 100644
index 000000000..6a917c3b9
--- /dev/null
+++ b/event-aggregator/src/main/java/com/iluwatar/App.java
@@ -0,0 +1,35 @@
+package com.iluwatar;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * The Event Aggregator pattern channels events from multiple objects
+ * into a single object to simplify registration for clients.
+ *
+ * In the example LordBaelish, LordVarys and Scout deliver events to
+ * KingsHand. KingsHand, the event aggregator, then delivers the events
+ * to KingJoffrey.
+ *
+ */
+public class App {
+
+ public static void main(String[] args) {
+
+ KingJoffrey kingJoffrey = new KingJoffrey();
+ KingsHand kingsHand = new KingsHand(kingJoffrey);
+
+ List emitters = new ArrayList<>();
+ emitters.add(kingsHand);
+ emitters.add(new LordBaelish(kingsHand));
+ emitters.add(new LordVarys(kingsHand));
+ emitters.add(new Scout(kingsHand));
+
+ for (Weekday day: Weekday.values()) {
+ for (EventEmitter emitter: emitters) {
+ emitter.timePasses(day);
+ }
+ }
+ }
+}
diff --git a/event-aggregator/src/main/java/com/iluwatar/Event.java b/event-aggregator/src/main/java/com/iluwatar/Event.java
new file mode 100644
index 000000000..8f62af015
--- /dev/null
+++ b/event-aggregator/src/main/java/com/iluwatar/Event.java
@@ -0,0 +1,21 @@
+package com.iluwatar;
+
+/**
+ *
+ * Event enumeration.
+ *
+ */
+public enum Event {
+
+ STARK_SIGHTED("Stark sighted"), WARSHIPS_APPROACHING("Warships approaching"), TRAITOR_DETECTED("Traitor detected");
+
+ private String description;
+
+ Event(String description) {
+ this.description = description;
+ }
+
+ public String toString() {
+ return description;
+ }
+}
diff --git a/event-aggregator/src/main/java/com/iluwatar/EventEmitter.java b/event-aggregator/src/main/java/com/iluwatar/EventEmitter.java
new file mode 100644
index 000000000..b698dca38
--- /dev/null
+++ b/event-aggregator/src/main/java/com/iluwatar/EventEmitter.java
@@ -0,0 +1,35 @@
+package com.iluwatar;
+
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ *
+ * EventEmitter is the base class for event producers that can be observed.
+ *
+ */
+public abstract class EventEmitter {
+
+ private List observers;
+
+ public EventEmitter() {
+ observers = new LinkedList<>();
+ }
+
+ public EventEmitter(EventObserver obs) {
+ this();
+ registerObserver(obs);
+ }
+
+ public void registerObserver(EventObserver obs) {
+ observers.add(obs);
+ }
+
+ protected void notifyObservers(Event e) {
+ for (EventObserver obs: observers) {
+ obs.onEvent(e);
+ }
+ }
+
+ public abstract void timePasses(Weekday day);
+}
diff --git a/event-aggregator/src/main/java/com/iluwatar/EventObserver.java b/event-aggregator/src/main/java/com/iluwatar/EventObserver.java
new file mode 100644
index 000000000..a642754ca
--- /dev/null
+++ b/event-aggregator/src/main/java/com/iluwatar/EventObserver.java
@@ -0,0 +1,12 @@
+package com.iluwatar;
+
+/**
+ *
+ * Observers of events implement this interface.
+ *
+ */
+public interface EventObserver {
+
+ void onEvent(Event e);
+
+}
diff --git a/event-aggregator/src/main/java/com/iluwatar/KingJoffrey.java b/event-aggregator/src/main/java/com/iluwatar/KingJoffrey.java
new file mode 100644
index 000000000..b37cd5e20
--- /dev/null
+++ b/event-aggregator/src/main/java/com/iluwatar/KingJoffrey.java
@@ -0,0 +1,14 @@
+package com.iluwatar;
+
+/**
+ *
+ * KingJoffrey observes events from KingsHand.
+ *
+ */
+public class KingJoffrey implements EventObserver {
+
+ @Override
+ public void onEvent(Event e) {
+ System.out.println("Received event from the King's Hand: " + e.toString());
+ }
+}
diff --git a/event-aggregator/src/main/java/com/iluwatar/KingsHand.java b/event-aggregator/src/main/java/com/iluwatar/KingsHand.java
new file mode 100644
index 000000000..09bec7502
--- /dev/null
+++ b/event-aggregator/src/main/java/com/iluwatar/KingsHand.java
@@ -0,0 +1,28 @@
+package com.iluwatar;
+
+/**
+ *
+ * KingsHand observes events from multiple sources and delivers them
+ * to listeners.
+ *
+ */
+public class KingsHand extends EventEmitter implements EventObserver {
+
+ public KingsHand() {
+ super();
+ }
+
+ public KingsHand(EventObserver obs) {
+ super(obs);
+ }
+
+ @Override
+ public void onEvent(Event e) {
+ notifyObservers(e);
+ }
+
+ @Override
+ public void timePasses(Weekday day) {
+ // NOP
+ }
+}
diff --git a/event-aggregator/src/main/java/com/iluwatar/LordBaelish.java b/event-aggregator/src/main/java/com/iluwatar/LordBaelish.java
new file mode 100644
index 000000000..38022546c
--- /dev/null
+++ b/event-aggregator/src/main/java/com/iluwatar/LordBaelish.java
@@ -0,0 +1,24 @@
+package com.iluwatar;
+
+/**
+ *
+ * LordBaelish produces events.
+ *
+ */
+public class LordBaelish extends EventEmitter {
+
+ public LordBaelish() {
+ super();
+ }
+
+ public LordBaelish(EventObserver obs) {
+ super(obs);
+ }
+
+ @Override
+ public void timePasses(Weekday day) {
+ if (day.equals(Weekday.FRIDAY)) {
+ notifyObservers(Event.STARK_SIGHTED);
+ }
+ }
+}
diff --git a/event-aggregator/src/main/java/com/iluwatar/LordVarys.java b/event-aggregator/src/main/java/com/iluwatar/LordVarys.java
new file mode 100644
index 000000000..5d5a25fe8
--- /dev/null
+++ b/event-aggregator/src/main/java/com/iluwatar/LordVarys.java
@@ -0,0 +1,24 @@
+package com.iluwatar;
+
+/**
+ *
+ * LordVarys produces events.
+ *
+ */
+public class LordVarys extends EventEmitter {
+
+ public LordVarys() {
+ super();
+ }
+
+ public LordVarys(EventObserver obs) {
+ super(obs);
+ }
+
+ @Override
+ public void timePasses(Weekday day) {
+ if (day.equals(Weekday.SATURDAY)) {
+ notifyObservers(Event.TRAITOR_DETECTED);
+ }
+ }
+}
diff --git a/event-aggregator/src/main/java/com/iluwatar/Scout.java b/event-aggregator/src/main/java/com/iluwatar/Scout.java
new file mode 100644
index 000000000..cdb43742a
--- /dev/null
+++ b/event-aggregator/src/main/java/com/iluwatar/Scout.java
@@ -0,0 +1,24 @@
+package com.iluwatar;
+
+/**
+ *
+ * Scout produces events.
+ *
+ */
+public class Scout extends EventEmitter {
+
+ public Scout() {
+ super();
+ }
+
+ public Scout(EventObserver obs) {
+ super(obs);
+ }
+
+ @Override
+ public void timePasses(Weekday day) {
+ if (day.equals(Weekday.TUESDAY)) {
+ notifyObservers(Event.WARSHIPS_APPROACHING);
+ }
+ }
+}
diff --git a/event-aggregator/src/main/java/com/iluwatar/Weekday.java b/event-aggregator/src/main/java/com/iluwatar/Weekday.java
new file mode 100644
index 000000000..f7552867f
--- /dev/null
+++ b/event-aggregator/src/main/java/com/iluwatar/Weekday.java
@@ -0,0 +1,16 @@
+package com.iluwatar;
+
+public enum Weekday {
+
+ MONDAY("Monday"), TUESDAY("Tuesday"), WEDNESDAY("Wednesday"), THURSDAY("Thursday"), FRIDAY("Friday"), SATURDAY("Saturday"), SUNDAY("Sunday");
+
+ private String description;
+
+ Weekday(String description) {
+ this.description = description;
+ }
+
+ public String toString() {
+ return description;
+ }
+}
diff --git a/event-aggregator/src/test/java/com/iluwatar/AppTest.java b/event-aggregator/src/test/java/com/iluwatar/AppTest.java
new file mode 100644
index 000000000..58c74fe79
--- /dev/null
+++ b/event-aggregator/src/test/java/com/iluwatar/AppTest.java
@@ -0,0 +1,13 @@
+package com.iluwatar;
+import org.junit.Test;
+
+import com.iluwatar.App;
+
+public class AppTest {
+
+ @Test
+ public void test() {
+ String[] args = {};
+ App.main(args);
+ }
+}
diff --git a/pom.xml b/pom.xml
index 92d10e951..7316f65f2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,7 +38,8 @@
double-checked-locking
servant
service-locator
- null-object
+ null-object
+ event-aggregator