summaryrefslogtreecommitdiff
path: root/graphs/java/observer/src
diff options
context:
space:
mode:
authorMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
committerMartial Simon <msimon_fr@hotmail.com>2025-09-15 01:08:27 +0200
commitc9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c (patch)
tree3e4f42f93c7ae89a364e4d51fff6e5cec4e55fa9 /graphs/java/observer/src
add: graphs et rushs
Diffstat (limited to 'graphs/java/observer/src')
-rw-r--r--graphs/java/observer/src/main/java/fr/epita/assistants/observer/Lifeguard.java21
-rw-r--r--graphs/java/observer/src/main/java/fr/epita/assistants/observer/Observable.java55
-rw-r--r--graphs/java/observer/src/main/java/fr/epita/assistants/observer/Person.java15
-rw-r--r--graphs/java/observer/src/main/java/fr/epita/assistants/observer/Swimmer.java55
-rw-r--r--graphs/java/observer/src/main/java/fr/epita/assistants/observer/SwimmerStatus.java11
5 files changed, 157 insertions, 0 deletions
diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Lifeguard.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Lifeguard.java
new file mode 100644
index 0000000..87c5538
--- /dev/null
+++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Lifeguard.java
@@ -0,0 +1,21 @@
+package fr.epita.assistants.observer;
+
+import java.util.Set;
+
+public class Lifeguard implements Observable.Observer<Swimmer> {
+ String name;
+
+ public Lifeguard(String name) {
+ this.name = name;
+ System.out.println(name + " begins to keep an eye on the swimmers.");
+ }
+
+ @Override
+ public void onEvent(Swimmer event) {
+ if (event.getStatus() == SwimmerStatus.TOO_FAR)
+ System.out.println(name + ": " + event.getName() + "! You are too far, come back!");
+ else if (event.getStatus() == SwimmerStatus.DROWNING) {
+ System.out.println(name + ": I will save you " + event.getName() + "!");
+ }
+ }
+}
diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Observable.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Observable.java
new file mode 100644
index 0000000..1739739
--- /dev/null
+++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Observable.java
@@ -0,0 +1,55 @@
+package fr.epita.assistants.observer;
+
+import java.util.Set;
+
+/**
+ * Observer interface.
+ *
+ * @param <EVENT_T> Type of observed events
+ */
+public interface Observable<EVENT_T> {
+
+ /**
+ * Get all registered observers.
+ *
+ * @return The set of observers
+ */
+ Set<Observer<EVENT_T>> getObservers();
+
+ /**
+ * Register observers.
+ *
+ * @param observers Observers to register
+ */
+ void register(final Observer<EVENT_T>... observers);
+
+ /**
+ * Unregister the given observer.
+ *
+ * @param observer The observer to deactivate
+ */
+ void unregister(final Observer<EVENT_T> observer);
+
+ /**
+ * Notify all registered observers of the given event.
+ *
+ * @param event The event to notify observers with.
+ */
+ void fire(final EVENT_T event);
+
+ /**
+ * Sub interface for observers.
+ *
+ * @param <EVENT_T> The type of observed events
+ */
+ @FunctionalInterface
+ interface Observer<EVENT_T> {
+
+ /**
+ * Notification callback.
+ *
+ * @param event The event being sent
+ */
+ void onEvent(final EVENT_T event);
+ }
+}
diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Person.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Person.java
new file mode 100644
index 0000000..81247ac
--- /dev/null
+++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Person.java
@@ -0,0 +1,15 @@
+package fr.epita.assistants.observer;
+
+public class Person implements Observable.Observer<Swimmer> {
+ String name;
+
+ public Person(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public void onEvent(Swimmer event) {
+ if (event.getStatus() == SwimmerStatus.WAVING)
+ System.out.println(name + ": Waves back at " + event.getName() + ".");
+ }
+}
diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Swimmer.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Swimmer.java
new file mode 100644
index 0000000..2ce803a
--- /dev/null
+++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/Swimmer.java
@@ -0,0 +1,55 @@
+package fr.epita.assistants.observer;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+public class Swimmer implements Observable<Swimmer> {
+ Set<Observer<Swimmer>> observers = new HashSet<>();
+ String name;
+ SwimmerStatus status = SwimmerStatus.OK;
+
+ public Swimmer(String name) {
+ this.name = name;
+ System.out.println(this.name + " goes into the sea.");
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public SwimmerStatus getStatus() {
+ return status;
+ }
+
+ @Override
+ public Set<Observer<Swimmer>> getObservers() {
+ return observers;
+ }
+
+ public void setStatus(SwimmerStatus status) {
+ this.status = status;
+ if (status == SwimmerStatus.DROWNING) {
+ System.out.println(name + ": I'm drowning, help!!");
+ }
+ else if (status == SwimmerStatus.WAVING)
+ System.out.println(name + ": Waves towards the shore.");
+ fire(this);
+ }
+
+ @Override
+ public void register(Observer<Swimmer>... observers) {
+ this.observers.addAll(Arrays.asList(observers));
+ }
+
+ @Override
+ public void unregister(Observer<Swimmer> observer) {
+ this.observers.remove(observer);
+ }
+
+ @Override
+ public void fire(Swimmer event) {
+ for (Observer<Swimmer> o : this.observers)
+ o.onEvent(event);
+ }
+}
diff --git a/graphs/java/observer/src/main/java/fr/epita/assistants/observer/SwimmerStatus.java b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/SwimmerStatus.java
new file mode 100644
index 0000000..71856c6
--- /dev/null
+++ b/graphs/java/observer/src/main/java/fr/epita/assistants/observer/SwimmerStatus.java
@@ -0,0 +1,11 @@
+package fr.epita.assistants.observer;
+
+/**
+ * Status of a swimmer.
+ */
+public enum SwimmerStatus {
+ OK,
+ DROWNING,
+ TOO_FAR,
+ WAVING
+}