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