From b45e774b66481d3841a7416d9d9f2dd6d6cb716b Mon Sep 17 00:00:00 2001
From: vetlesho <vetlesho@stud.ntnu.no>
Date: Wed, 10 Apr 2024 14:20:55 +0200
Subject: [PATCH] Implemented observer design pattern for ChaosGame.

---
 .../java/org/example/chaosgame/MainApp.java   |  4 ++-
 .../controller/ChaosGameSubject.java          |  7 ++++
 .../chaosgame/controller/MainController.java  | 19 ++++++++++-
 .../chaosgame/controller/Observer.java        |  5 +++
 .../chaosgame/model/chaos/ChaosGame.java      | 32 +++++++++++++++++--
 .../org/example/chaosgame/view/ChaosPage.java |  9 ------
 6 files changed, 63 insertions(+), 13 deletions(-)
 create mode 100644 src/main/java/org/example/chaosgame/controller/ChaosGameSubject.java
 create mode 100644 src/main/java/org/example/chaosgame/controller/Observer.java

diff --git a/src/main/java/org/example/chaosgame/MainApp.java b/src/main/java/org/example/chaosgame/MainApp.java
index 4a05a6d..20aa139 100644
--- a/src/main/java/org/example/chaosgame/MainApp.java
+++ b/src/main/java/org/example/chaosgame/MainApp.java
@@ -6,7 +6,10 @@ import javafx.scene.control.Button;
 import javafx.scene.layout.BorderPane;
 import javafx.scene.layout.HBox;
 import javafx.stage.Stage;
+import org.example.chaosgame.controller.MainController;
+import org.example.chaosgame.model.chaos.ChaosGame;
 import org.example.chaosgame.model.chaos.ChaosGameDescription;
+import org.example.chaosgame.model.chaos.ChaosGameDescriptionFactory;
 import org.example.chaosgame.model.chaos.ChaosGameFileHandler;
 import org.example.chaosgame.view.ChaosPage;
 import org.example.chaosgame.view.ExplorePage;
@@ -34,7 +37,6 @@ public class MainApp extends Application {
     });
     Button exploreButton = menuView.getExploreButton();
     exploreButton.setOnAction(e-> {
-
       borderPane.setCenter(explorePage.getExploreContent());
     });
     HBox menuBar = menuView.getMenuBar();
diff --git a/src/main/java/org/example/chaosgame/controller/ChaosGameSubject.java b/src/main/java/org/example/chaosgame/controller/ChaosGameSubject.java
new file mode 100644
index 0000000..36dd862
--- /dev/null
+++ b/src/main/java/org/example/chaosgame/controller/ChaosGameSubject.java
@@ -0,0 +1,7 @@
+package org.example.chaosgame.controller;
+
+public interface ChaosGameSubject {
+  void registerObserver(Observer observer);
+  void removeObserver(Observer observer);
+  void notifyObservers();
+}
diff --git a/src/main/java/org/example/chaosgame/controller/MainController.java b/src/main/java/org/example/chaosgame/controller/MainController.java
index d00c243..fe97afa 100644
--- a/src/main/java/org/example/chaosgame/controller/MainController.java
+++ b/src/main/java/org/example/chaosgame/controller/MainController.java
@@ -1,5 +1,22 @@
 package org.example.chaosgame.controller;
 
-public class MainController {
+import javafx.scene.layout.StackPane;
+import org.example.chaosgame.model.chaos.ChaosGame;
+import org.example.chaosgame.view.ChaosPage;
 
+public class MainController implements Observer{
+  private final ChaosGame chaosGame;
+  private final ChaosPage chaosPage;
+
+
+  public MainController(ChaosGame chaosGame) {
+    this.chaosGame = chaosGame;
+    this.chaosPage = new ChaosPage();
+    chaosGame.registerObserver(this);
+  }
+
+  @Override
+  public void update() {
+    chaosPage.updateCanvas();
+  }
 }
diff --git a/src/main/java/org/example/chaosgame/controller/Observer.java b/src/main/java/org/example/chaosgame/controller/Observer.java
new file mode 100644
index 0000000..584d01d
--- /dev/null
+++ b/src/main/java/org/example/chaosgame/controller/Observer.java
@@ -0,0 +1,5 @@
+package org.example.chaosgame.controller;
+
+public interface Observer {
+  void update();
+}
diff --git a/src/main/java/org/example/chaosgame/model/chaos/ChaosGame.java b/src/main/java/org/example/chaosgame/model/chaos/ChaosGame.java
index 82c4712..88ec0ec 100644
--- a/src/main/java/org/example/chaosgame/model/chaos/ChaosGame.java
+++ b/src/main/java/org/example/chaosgame/model/chaos/ChaosGame.java
@@ -1,7 +1,11 @@
 package org.example.chaosgame.model.chaos;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
+
+import org.example.chaosgame.controller.ChaosGameSubject;
+import org.example.chaosgame.controller.Observer;
 import org.example.chaosgame.model.linalg.Vector2D;
 
 /**
@@ -13,14 +17,15 @@ import org.example.chaosgame.model.linalg.Vector2D;
  * The new point is then drawn on the canvas.
  * This process is repeated a selected amount of steps.
  */
-public class ChaosGame {
+public class ChaosGame implements ChaosGameSubject {
   private final ChaosCanvas canvas;
 
   private final ChaosGameDescription description;
 
   private Vector2D currentPoint = new Vector2D(0.0, 0.0);
 
-  public final Random random = new Random();
+  private final Random random = new Random();
+  private List<Observer> observers;
 
   /**
    * Constructor for ChaosGame.
@@ -36,6 +41,7 @@ public class ChaosGame {
     this.description = description;
     this.canvas = new ChaosCanvas(width, height,
             description.getMinCoords(), description.getMaxCoords());
+    this.observers = new ArrayList<>();
   }
 
 
@@ -55,6 +61,7 @@ public class ChaosGame {
     } else {
       runStepsUniform(steps);
     }
+    notifyObservers();
   }
   private void runStepsUniform(int steps) {
     for (int i = 0; i < steps; i++) {
@@ -90,4 +97,25 @@ public class ChaosGame {
       canvas.putPixel(currentPoint);
     }
   }
+
+  @Override
+  public void registerObserver(Observer observer) {
+    observers.add(observer);
+    System.out.println("Observer added");
+  }
+
+  @Override
+  public void removeObserver(Observer observer) {
+    observers.remove(observer);
+    System.out.println("Observer removed");
+  }
+
+  @Override
+  public void notifyObservers() {
+    for (Observer observer : observers) {
+      observer.update();
+      System.out.println("Observer notified");
+    }
+  }
 }
+
diff --git a/src/main/java/org/example/chaosgame/view/ChaosPage.java b/src/main/java/org/example/chaosgame/view/ChaosPage.java
index 6e01920..658dfd3 100644
--- a/src/main/java/org/example/chaosgame/view/ChaosPage.java
+++ b/src/main/java/org/example/chaosgame/view/ChaosPage.java
@@ -26,7 +26,6 @@ public class ChaosPage {
   private final Canvas canvas;
   private final GraphicsContext gc;
   private final Label errorLabel = new Label("Invalid input. Please enter a valid number.");
-
   private final VBox runStepsBox = new VBox();
 
   public ChaosPage() {
@@ -42,16 +41,8 @@ public class ChaosPage {
     stepsField.setPromptText("Enter number of steps");
 
 
-
     ComboBox<String> contextMenu = new ComboBox<>();
     contextMenu.setPromptText("Select chaos game");
-    ColorAdjust shade = new ColorAdjust();
-    shade.setBrightness(0.4);
-    contextMenu.addEventHandler(MouseEvent.MOUSE_ENTERED,
-            e -> contextMenu.setEffect(shade));
-    contextMenu.addEventHandler(MouseEvent.MOUSE_EXITED,
-            e -> contextMenu.setEffect(null));
-
 
     contextMenu.getItems().addAll("Julia", "Sierpinski", "Barnsley", "Make your own");
 
-- 
GitLab