diff options
Diffstat (limited to 'graphs/java/observer')
7 files changed, 328 insertions, 0 deletions
diff --git a/graphs/java/observer/.gitignore b/graphs/java/observer/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/graphs/java/observer/.gitignore @@ -0,0 +1,38 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store
\ No newline at end of file diff --git a/graphs/java/observer/pom.xml b/graphs/java/observer/pom.xml new file mode 100644 index 0000000..5755011 --- /dev/null +++ b/graphs/java/observer/pom.xml @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>fr.epita.assistants</groupId> + <artifactId>observer</artifactId> + <version>1.0</version> + + <properties> + <versions.java>21</versions.java> + <versions.junit>5.9.1</versions.junit> + <versions.maven-compiler-plugin>3.13.0</versions.maven-compiler-plugin> + <versions.maven-surefire-plugin>3.5.0</versions.maven-surefire-plugin> + <versions.maven-jar-plugin>3.1.1</versions.maven-jar-plugin> + <versions.maven-install-plugin>3.1.0</versions.maven-install-plugin> + + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + + <surefire.reportsDirectory>${project.build.directory}/surefire-reports</surefire.reportsDirectory> + </properties> + + <dependencies> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter</artifactId> + <version>${versions.junit}</version> + </dependency> + <dependency> + <groupId>org.apache.maven.surefire</groupId> + <artifactId>surefire-junit-platform</artifactId> + <version>${versions.maven-surefire-plugin}</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-compat</artifactId> + <version>3.9.8</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-plugin-api</artifactId> + <version>3.9.8</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-project</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-core</artifactId> + <version>3.8.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-monitor</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-utils</artifactId> + <version>3.0.24</version> + </dependency> + <dependency> + <groupId>org.apache.maven.shared</groupId> + <artifactId>maven-filtering</artifactId> + <version>3.3.2</version> + </dependency> + <dependency> + <groupId>org.codehaus.plexus</groupId> + <artifactId>plexus-interpolation</artifactId> + <version>1.13</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-profile</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-artifact-manager</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-plugin-registry</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.maven</groupId> + <artifactId>maven-repository-metadata</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>classworlds</groupId> + <artifactId>classworlds</artifactId> + <version>1.1</version> + </dependency> + <dependency> + <groupId>org.junit.platform</groupId> + <artifactId>junit-platform-commons</artifactId> + <version>1.9.3</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>${versions.maven-compiler-plugin}</version> + <configuration> + <source>${versions.java}</source> + <target>${versions.java}</target> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-install-plugin</artifactId> + <version>${versions.maven-install-plugin}</version> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>${versions.maven-surefire-plugin}</version> + <configuration> + <reportsDirectory>${surefire.reportsDirectory}</reportsDirectory> + </configuration> + </plugin> + </plugins> + </build> +</project> 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 +} |
