diff --git a/src/main/java/musterklausur/Gefaess.java b/src/main/java/musterklausur/Gefaess.java index b2df8b9..1423870 100644 --- a/src/main/java/musterklausur/Gefaess.java +++ b/src/main/java/musterklausur/Gefaess.java @@ -3,29 +3,35 @@ import java.text.NumberFormat; /** - * stellt ein Gefäß für den Verkauf dar + * Die abstrakte Klasse Gefaess stellt ein Gefäß für den Verkauf dar. + * Sie enthält den Preis pro cm³ des Inhalts des Gefäßes und Methoden + * zum Abrufen des Namens, Vergleichen, Berechnen des Preises und + * Berechnen des Volumens. Konkrete Unterklassen müssen die abstrakte + * Methode getVolumen implementieren, um das Volumen des Gefäßes zu + * berechnen. Die Klasse dient als Basisklasse für die konkreten + * Gefäßtypen Zylinder, Quader und Pyramide. * * @author Doro */ public abstract class Gefaess { /** - * Preis pro cm³ des Inhalts des Gefäßes + * Der Preis pro cm³ des Inhalts des Gefäßes. */ - private double preisInhalt; + private final double preisInhalt; /** - * erzeugt ein Gefäß mit dem angegebenen Inhaltspreis + * Erzeugt ein Gefäß mit dem angegebenen Inhaltspreis. * - * @param preisInhalt + * @param preisInhalt Der Preis pro cm³ des Inhalts des Gefäßes. */ public Gefaess(double preisInhalt) { this.preisInhalt = preisInhalt; } /** - * liefert den Namen des Gefäßes zurück + * Liefert den Namen des Gefäßes zurück. * - * @return Name des Gefäßes + * @return Der Name des Gefäßes. */ public String getName() { return this.getClass().getSimpleName() + "(" + this.preisInhalt + ")"; @@ -33,31 +39,37 @@ public String getName() { /** * Vergleich von this mit other; Zwei Gefäße gelten als gleich, - * wenn sie vom gleichen Subtyp sind und den gleichen Preis haben + * wenn sie vom gleichen Subtyp sind und den gleichen Preis haben. * - * @param other - * @return true, wenn beide Gefäße als gleich gelten + * @param other Das andere Objekt, mit dem verglichen wird. + * @return true, wenn beide Gefäße als gleich gelten, sonst false. */ @Override public boolean equals(Object other) { if (this == other) return true; - if (other == null) - return false; - if (this.getClass() != other.getClass()) + if (other == null || getClass() != other.getClass()) return false; Gefaess g = (Gefaess) other; - if (this.getPreis() == g.getPreis()) - return true; - else - return false; + return Double.compare(g.preisInhalt, preisInhalt) == 0; } + /** + * Berechnet den Hashcode des Gefäßes, basierend auf dem Klassentyp und dem Preis des Inhalts. + * + * @return Der Hashcode des Gefäßes. + */ @Override public int hashCode() { - return this.getClass().hashCode() * 59 + Double.hashCode(this.getPreis()); + return getClass().hashCode() * 59 + Double.hashCode(preisInhalt); } + /** + * Gibt eine textuelle Darstellung des Gefäßes zurück, + * die den Klassennamen und den Preis des Inhalts enthält. + * + * @return Die textuelle Darstellung des Gefäßes. + */ @Override public String toString() { NumberFormat nf = NumberFormat.getCurrencyInstance(); @@ -65,11 +77,24 @@ public String toString() { + nf.format(this.getPreis()); } - // TODO: JavaDoc - public double getPreis() { - return this.getVolumen() * this.preisInhalt; - } + /** + * Berechnet den Preis des Inhalts des Gefäßes basierend auf dem Volumen + * und dem Preis pro cm³ des Inhalts. + * Diese Methode arbeitet nach dem Template Method Pattern, da sie die abstrakte Methode + * getVolumen aufruft, die von den konkreten Unterklassen implementiert werden muss, + * um das Volumen zu berechnen. + * + * @return Der Preis des Inhalts des Gefäßes. + */ + public double getPreis() { + return this.getVolumen() * this.preisInhalt; + } - // TODO: JavaDoc - abstract double getVolumen(); + /** + * Diese abstrakte Methode muss von den konkreten Unterklassen implementiert werden, + * um das Volumen des Gefäßes zu berechnen. + * + * @return Das Volumen des Gefäßes. + */ + abstract double getVolumen(); } diff --git a/src/main/java/musterklausur/Gefaessfabrik.java b/src/main/java/musterklausur/Gefaessfabrik.java index 0f0e51f..4c4c09c 100644 --- a/src/main/java/musterklausur/Gefaessfabrik.java +++ b/src/main/java/musterklausur/Gefaessfabrik.java @@ -1,17 +1,32 @@ package musterklausur; /** - * Abstrakte Gefässfabrik zum Erzeugen eines neuen Gefäßes. + * Abstrakte Gefäßfabrik zum Erzeugen eines neuen Gefäßes. + * Diese Klasse arbeitet nach dem Abstract Factory Pattern, bei dem eine abstrakte + * Methode zum Erstellen eines neuen Gefäßes deklariert ist, die von den konkreten + * Unterklassen implementiert werden muss, um das spezifische Gefäß zu erzeugen. + *

+ * Die konkreten Unterklassen können verschiedene Arten von Gefäßen erstellen, + * die von der abstrakten Klasse Gefaess abgeleitet sind. + *

+ * Die Parameter der erstelleGefaess-Methode sind die erforderlichen Eigenschaften, + * die zur Erzeugung des Gefäßes benötigt werden (z. B. Länge, Höhe und Preis). + *

+ * Beachte: Da dies eine abstrakte Klasse ist, können keine Objekte dieser Klasse + * direkt erzeugt werden. Stattdessen müssen die konkreten Unterklassen erstellt werden, + * die die abstrakte Methode implementieren und tatsächlich Gefäße erzeugen können. + * + * @author frievoe97 */ abstract class Gefaessfabrik { /** * Abstrakte Implementierung der Methode zum Erstellen eines neuen Gefäßes. * - * @param laenge - * @param hoehe - * @param preis - * @return Produziertes Gefäß + * @param laenge Die Länge des neuen Gefäßes. + * @param hoehe Die Höhe des neuen Gefäßes. + * @param preis Der Preis pro cm³ des Inhalts des neuen Gefäßes. + * @return Produziertes Gefäß, das von der abstrakten Klasse Gefaess abgeleitet ist. */ abstract Gefaess erstelleGefaess(double laenge, double hoehe, double preis); } diff --git a/src/main/java/musterklausur/HausTausenderWunder.java b/src/main/java/musterklausur/HausTausenderWunder.java index b9edb2c..621a1fc 100644 --- a/src/main/java/musterklausur/HausTausenderWunder.java +++ b/src/main/java/musterklausur/HausTausenderWunder.java @@ -10,27 +10,33 @@ import java.util.stream.Collectors; /** - * Diese Klasse stellt den Laden "Haus Tausender Wunder" dar, der - * viele tolle Gefäße produziert und aus dem Lager heraus verkauft. + * Die Klasse HausTausenderWunder repräsentiert den Laden "Haus Tausender Wunder", der viele + * tolle Gefäße produziert und aus dem Lager heraus verkauft. Das HausTausenderWunder-Objekt + * verwaltet die Lagerverwaltung, startet und stoppt die Produktion von Gefäßen und benachrichtigt + * Beobachter über Änderungen im Lagerbestand. Die Klasse implementiert das Observer Pattern + * mit dem LagerBeobachter-Interface, um auf Änderungen im Lagerbestand zu reagieren. Sie ist + * ein wichtiger Bestandteil des Abstract Factory Patterns, da sie die Gefäßproduktion und + * Lagerverwaltung steuert. Die Gesamtsumme des Lagerbestands wird über ein DoubleProperty + * gespeichert, um Beobachtern die Aktualisierung zu ermöglichen. * * @author Doro */ public class HausTausenderWunder { /** - * Anzahl der Gefäße nach der Art des Gefäßes. + * Eine Map, die die Anzahl der Gefäße nach der Art des Gefäßes speichert. */ private final Map lagerverwaltung = new HashMap<>(); /** - * Gesamtpreis des Lagerbestands. + * Das DoubleProperty, das den Gesamtpreis des Lagerbestands speichert. */ private final DoubleProperty gesamtpreis = new SimpleDoubleProperty(0); /** - * Property des Gesamtpreises. + * Gibt das DoubleProperty des Gesamtpreises zurück. * - * @return Property des Gesamtpreises. + * @return Das DoubleProperty des Gesamtpreises. */ public DoubleProperty gesamtpreisProperty() { return this.gesamtpreis; @@ -42,19 +48,18 @@ public DoubleProperty gesamtpreisProperty() { private Thread produktionsThread; /** - * Liste aller Beobachter. + * Eine Liste aller Beobachter, die auf Änderungen im Lagerbestand reagieren. */ private final List beobachter = new ArrayList<>(); /** - * startet die Endlosproduktion von Gefäßen der angegebenen Größe - * mithilfe der Fabrik und fügt die erstellten Gefäße in die - * Lagerverwaltung ein + * Startet die Endlosproduktion von Gefäßen der angegebenen Größe mithilfe + * der Fabrik und fügt die erstellten Gefäße in die Lagerverwaltung ein. * - * @param fabrik - * @param preisInhalt - * @param laenge - * @param hoehe + * @param fabrik Die Gefäßfabrik, die zum Erstellen der Gefäße verwendet wird. + * @param preisInhalt Der Preis pro cm³ des Inhalts der Gefäße. + * @param laenge Die Länge der zu produzierenden Gefäße. + * @param hoehe Die Höhe der zu produzierenden Gefäße. */ public void produktionStarten(Gefaessfabrik fabrik, double preisInhalt, double laenge, double hoehe) { @@ -68,17 +73,17 @@ public void produktionStarten(Gefaessfabrik fabrik, double preisInhalt, } /** - * stoppt alle laufenden Produktionen + * Stoppt alle laufenden Produktionen. */ public void produktionStoppen() { produktionsThread.interrupt(); } /** - * entnimmt das Gefäß g aus der Lagerverwaltung + * Entnimmt das Gefäß g aus der Lagerverwaltung. * - * @param gefaess - * @throws NichtVorhandenException, wenn g nicht im Lager vorhanden ist + * @param gefaess Das Gefäß, das aus dem Lager entnommen werden soll. + * @throws NichtVorhandenException Wenn das Gefäß nicht im Lager vorhanden ist. */ public void gefaessKaufen(Gefaess gefaess) throws NichtVorhandenException { @@ -96,9 +101,9 @@ public void gefaessKaufen(Gefaess gefaess) throws NichtVorhandenException { } /** - * fügt das Gefäß g in die Lagerverwaltung ein + * Fügt das Gefäß g in die Lagerverwaltung ein. * - * @param gefaess + * @param gefaess Das Gefäß, das in das Lager eingefügt werden soll. */ protected void gefaessEinfuegen(Gefaess gefaess) { if (gefaess != null) { @@ -110,9 +115,9 @@ protected void gefaessEinfuegen(Gefaess gefaess) { } /** - * liefert einen textuelle Liste aller Gefäße mit ihrer Anzahl zurück + * Liefert eine textuelle Liste aller Gefäße mit ihrer Anzahl im Lager zurück. * - * @return + * @return Textuelle Liste aller Gefäße mit ihrer Anzahl. */ public String getGefaessliste() { // TODO: Map Streams zu Beispielen hinzufügen @@ -125,7 +130,7 @@ public String getGefaessliste() { /** * Fügt einen neuen Beobachter hinzu. * - * @param lagerBeobachter + * @param lagerBeobachter Der hinzuzufügende LagerBeobachter. */ public void beobachterHinzufuegen(LagerBeobachter lagerBeobachter) { beobachter.add(lagerBeobachter); @@ -134,14 +139,14 @@ public void beobachterHinzufuegen(LagerBeobachter lagerBeobachter) { /** * Entfernt einen Beobachter aus der Liste. * - * @param lagerBeobachter + * @param lagerBeobachter Der zu entfernende LagerBeobachter. */ public void beobachterEntfernen(LagerBeobachter lagerBeobachter) { beobachter.remove(lagerBeobachter); } /** - * Benachrcihtigt alle Beobachter über eine Änderung in der Lagerverwaltung. + * Benachrichtigt alle Beobachter über eine Änderung in der Lagerverwaltung. */ public void benachrichtigen() { for (LagerBeobachter lagerBeobachter : beobachter) { diff --git a/src/main/java/musterklausur/LagerBeobachter.java b/src/main/java/musterklausur/LagerBeobachter.java index f2ec302..3a5b787 100644 --- a/src/main/java/musterklausur/LagerBeobachter.java +++ b/src/main/java/musterklausur/LagerBeobachter.java @@ -1,6 +1,43 @@ package musterklausur; +/** + * Das Interface `LagerBeobachter` dient dem Observer Pattern, bei dem Objekte + * Änderungen an einem bestimmten Subjekt (Lager) verfolgen können. + *

+ * Ein Objekt, das dieses Interface implementiert, kann als Beobachter für das Lager + * dienen und wird über Änderungen im Lagerbestand informiert, indem die Methode + * `lagerGeaendert()` aufgerufen wird. + *

+ * Die Klasse `HausTausenderWunder` enthält eine Liste von LagerBeobachter-Objekten, + * die über Änderungen im Lager informiert werden, wenn neue Gefäße hinzugefügt oder + * vorhandene Gefäße gekauft werden. + *

+ * Um das Observer Pattern zu implementieren, muss eine Klasse dieses Interface + * implementieren und die gewünschten Aktionen in der Methode `lagerGeaendert()` ausführen, + * wenn sie benachrichtigt wird. + *

+ * LagerBeobachter meinBeobachter = new MeinBeobachter(); + * hausTausenderWunder.beobachterHinzufuegen(meinBeobachter); + *

+ * Wenn nun das Lager aktualisiert wird (z.B. durch Hinzufügen oder Kaufen von Gefäßen), + * wird die `lagerGeaendert()`-Methode des `MeinBeobachter`-Objekts aufgerufen und die + * entsprechenden Aktionen werden ausgeführt. + *

+ * Beachte: Das Interface enthält nur eine Methode, die die Beobachter informiert, + * ohne zusätzliche Argumente. Bei Bedarf können weitere Informationen im Lagerbeobachter + * implementiert werden, indem zusätzliche Parameter an die `lagerGeaendert()`-Methode + * hinzugefügt werden. + * + * @author frievoe97 + * @see HausTausenderWunder + * @see HausTausenderWunder#beobachterHinzufuegen(LagerBeobachter) + * @see HausTausenderWunder#benachrichtigen() + * @see LagerBeobachter#lagerGeaendert() + */ interface LagerBeobachter { + /** + * Wird aufgerufen, wenn Änderungen im Lagerbestand festgestellt werden. + * Implementierende Klassen sollten die gewünschten Aktionen in dieser Methode ausführen. + */ void lagerGeaendert(); } - diff --git a/src/main/java/musterklausur/NichtVorhandenException.java b/src/main/java/musterklausur/NichtVorhandenException.java index e8c584f..d8f6f3c 100644 --- a/src/main/java/musterklausur/NichtVorhandenException.java +++ b/src/main/java/musterklausur/NichtVorhandenException.java @@ -3,8 +3,8 @@ /** * Diese Exception tritt auf, wenn ein gewünschtes Gefäß * nicht im Lager vorhanden ist - * @author Doro * + * @author Doro */ public class NichtVorhandenException extends Exception { diff --git a/src/main/java/musterklausur/Pyramide.java b/src/main/java/musterklausur/Pyramide.java index ffbf99f..1f54459 100644 --- a/src/main/java/musterklausur/Pyramide.java +++ b/src/main/java/musterklausur/Pyramide.java @@ -1,36 +1,52 @@ package musterklausur; /** - * Pyramidenförmiges Gefäß mit quadratischer Grundfläche - * @author Doro + * Die Klasse Pyramide stellt ein pyramidenförmiges Gefäß mit quadratischer Grundfläche dar. + * Sie erbt von der abstrakten Klasse Gefaess und implementiert die abstrakte Methode getVolumen, + * um das Volumen der Pyramide zu berechnen. + * Die Klasse enthält die Länge einer Seite der Grundfläche und die Höhe der Pyramide. + *

+ * Der Konstruktor ermöglicht die Erstellung eines Pyramiden-Gefäßes mit den angegebenen Werten + * für den Preis des Inhalts, die Seitenlänge und die Höhe. + *

+ * Das Volumen der Pyramide wird basierend auf den angegebenen Werten für die Seitenlänge und die Höhe berechnet. + *

* + * @author Doro */ -public class Pyramide extends Gefaess { +public final class Pyramide extends Gefaess { + + /** + * Die Länge einer Seite der Grundfläche in cm. + */ + private final double seitenlaenge; - /** - * Länge einer Seite der Grundfläche in cm - */ - private double seitenlaenge; - /** - * Höhe der Pyramide in cm - */ - private double hoehe; + /** + * Die Höhe der Pyramide in cm. + */ + private final double hoehe; - /** - * erstellt ein Pyramiden-Gefäß mit den angegegeben Werten - * @param preisInhalt - * @param seitenlaenge - * @param hoehe - */ - public Pyramide(double preisInhalt, double seitenlaenge, double hoehe) { - super(preisInhalt); - this.seitenlaenge = seitenlaenge; - this.hoehe = hoehe; - } + /** + * Erstellt ein Pyramiden-Gefäß mit den angegebenen Werten für den Preis des Inhalts, + * die Seitenlänge und die Höhe. + * + * @param preisInhalt Der Preis pro cm³ des Inhalts der Pyramide. + * @param seitenlaenge Die Länge einer Seite der Grundfläche der Pyramide. + * @param hoehe Die Höhe der Pyramide. + */ + public Pyramide(double preisInhalt, double seitenlaenge, double hoehe) { + super(preisInhalt); + this.seitenlaenge = seitenlaenge; + this.hoehe = hoehe; + } - // TODO: JavaDoc - @Override - double getVolumen() { - return (1./3) * Math.pow(this.seitenlaenge, 2) * this.hoehe; - } + /** + * Berechnet das Volumen der Pyramide basierend auf den angegebenen Werten für die Seitenlänge und die Höhe. + * + * @return Das Volumen der Pyramide. + */ + @Override + double getVolumen() { + return (1. / 3) * Math.pow(this.seitenlaenge, 2) * this.hoehe; + } } diff --git a/src/main/java/musterklausur/Quader.java b/src/main/java/musterklausur/Quader.java index c7b912a..8efc246 100644 --- a/src/main/java/musterklausur/Quader.java +++ b/src/main/java/musterklausur/Quader.java @@ -1,35 +1,51 @@ package musterklausur; + /** - * Quaderförmiges Gefäß mit quadratischer Grundfläche - * @author Doro + * Die Klasse Quader stellt ein quaderförmiges Gefäß mit quadratischer Grundfläche dar. + * Sie erbt von der abstrakten Klasse Gefaess und implementiert die abstrakte Methode getVolumen, + * um das Volumen des Quaders zu berechnen. + * Die Klasse enthält die Länge einer Seite der Grundfläche und die Höhe des Quaders. + *

+ * Der Konstruktor ermöglicht die Erstellung eines Quader-Gefäßes mit den angegebenen Werten + * für den Preis des Inhalts, die Seitenlänge und die Höhe. + *

+ * Das Volumen des Quaders wird basierend auf den angegebenen Werten für die Seitenlänge und die Höhe berechnet. * + * @author Doro */ -public class Quader extends Gefaess { +public final class Quader extends Gefaess { + + /** + * Die Länge einer Seite der Grundfläche in cm. + */ + private final double seitenlaenge; - /** - * Länge einer Seite der Grundfläche in cm - */ - private double seitenlaenge; - /** - * Höhe des Quaders in cm - */ - private double hoehe; + /** + * Die Höhe des Quaders in cm. + */ + private final double hoehe; - /** - * erstellt ein Quader-Gefäß mit den angegebenen Werten - * @param preisInhalt - * @param seitenlaenge - * @param hoehe - */ - public Quader(double preisInhalt, double seitenlaenge, double hoehe) { - super(preisInhalt); - this.seitenlaenge = seitenlaenge; - this.hoehe = hoehe; - } + /** + * Erstellt ein Quader-Gefäß mit den angegebenen Werten für den Preis des Inhalts, + * die Seitenlänge und die Höhe. + * + * @param preisInhalt Der Preis pro cm³ des Inhalts des Quaders. + * @param seitenlaenge Die Länge einer Seite der Grundfläche des Quaders. + * @param hoehe Die Höhe des Quaders. + */ + public Quader(double preisInhalt, double seitenlaenge, double hoehe) { + super(preisInhalt); + this.seitenlaenge = seitenlaenge; + this.hoehe = hoehe; + } - // TODO: JavaDoc - @Override - double getVolumen() { - return Math.pow(this.seitenlaenge, 2) * this.hoehe; - } + /** + * Berechnet das Volumen des Quaders basierend auf den angegebenen Werten für die Seitenlänge und die Höhe. + * + * @return Das Volumen des Quaders. + */ + @Override + double getVolumen() { + return Math.pow(this.seitenlaenge, 2) * this.hoehe; + } } diff --git a/src/main/java/musterklausur/WunderController.java b/src/main/java/musterklausur/WunderController.java index d5f5915..38239ce 100644 --- a/src/main/java/musterklausur/WunderController.java +++ b/src/main/java/musterklausur/WunderController.java @@ -14,7 +14,15 @@ import javafx.scene.control.TextField; import javafx.stage.Stage; -public class WunderController extends Application implements LagerBeobachter { +/** + * Die Klasse WunderController ist der Controller für die Benutzeroberfläche des "Haus Tausender Wunder". + * Sie erbt von der JavaFX Application-Klasse und implementiert das LagerBeobachter-Interface. + * Der Controller ermöglicht die Interaktion mit der Benutzeroberfläche und die Steuerung der Anwendung. + * Er verwaltet das "Haus Tausender Wunder" und stellt die Verbindung zwischen der Benutzeroberfläche und dem Modell her. + * + * @author Doro + */ +public final class WunderController extends Application implements LagerBeobachter { @FXML private TextArea txtGefaesse; @@ -31,27 +39,42 @@ public class WunderController extends Application implements LagerBeobachter { @FXML private TextField txtGesamtpreis; - private HausTausenderWunder htw = new HausTausenderWunder(); + private final HausTausenderWunder htw = new HausTausenderWunder(); + /** + * Initialisiert die Benutzeroberfläche nach dem Laden des FXML-Dokuments. + * Wird automatisch von JavaFX aufgerufen. + * Fügt die möglichen Gefäßformen zur ChoiceBox hinzu und fügt den Controller als LagerBeobachter hinzu. + * Bindet das Property für den Gesamtpreis an das Textfeld für die Anzeige. + */ @FXML private void initialize() { ObservableList obs; - obs = FXCollections.observableArrayList(new String[]{"Zylinder", "Quader", "Pyramide"}); + obs = FXCollections.observableArrayList("Zylinder", "Quader", "Pyramide"); chbForm.setItems(obs); chbForm.getSelectionModel().selectFirst(); htw.beobachterHinzufuegen(this); this.txtGesamtpreis.textProperty().bind(this.htw.gesamtpreisProperty().asString()); } + /** + * Aktualisiert die Anzeige der Gefäßliste im TextArea auf der Benutzeroberfläche. + * Da JavaFX-Elemente nur auf dem JavaFX Application Thread aktualisiert werden dürfen, + * wird die Aktualisierung mit Platform.runLater() durchgeführt. + * + * @param text Der zu aktualisierende Text. + */ private void listeAktualisieren(String text) { - Platform.runLater(() -> - { + Platform.runLater(() -> { txtGefaesse.setText(text); }); } /** - * startet die Produktion + * Startet die Produktion von Gefäßen basierend auf den eingegebenen Werten + * für den Preis des Inhalts, die Länge und die Höhe. + * Die Produktion erfolgt mithilfe einer Gefäßfabrik, die zufällig Gefäße erstellt. + * Aktualisiert die Benutzeroberfläche mit einer Meldung über den Start der Produktion. */ public void starten() { double preisInhalt; @@ -70,7 +93,8 @@ public void starten() { } /** - * stoppt die Produktion + * Stoppt die Produktion von Gefäßen. + * Aktualisiert die Benutzeroberfläche mit einer Meldung über den gestoppten Produktionsvorgang. */ public void stoppen() { htw.produktionStoppen(); @@ -78,28 +102,31 @@ public void stoppen() { } /** - * kauft ein Gefäß + * Kauft ein ausgewähltes Gefäß basierend auf den eingegebenen Werten für Länge, Höhe und Preis des Inhalts. + * Das ausgewählte Gefäß wird anhand des Inhalts der ChoiceBox ermittelt. + * Wenn das Gefäß vorhanden ist, wird es aus dem Lager entnommen und der Gesamtpreis wird aktualisiert. + * Bei Fehlern (z. B. keine Zahl eingegeben oder Gefäß nicht vorhanden) wird eine entsprechende Meldung angezeigt. */ public void kaufen() { try { - double l = Double.parseDouble(txtLaenge.getText()); - double h = Double.parseDouble(txtHoehe.getText()); - double p = Double.parseDouble(txtPreisinhalt.getText()); + double laenge = Double.parseDouble(txtLaenge.getText()); + double hoehe = Double.parseDouble(txtHoehe.getText()); + double preis = Double.parseDouble(txtPreisinhalt.getText()); String form = chbForm.getValue(); - Gefaess g = null; + Gefaess gefaess = null; switch (form) { case "Zylinder": - g = new Zylinder(p, l, h); + gefaess = new Zylinder(preis, laenge, hoehe); break; case "Quader": - g = new Quader(p, l, h); + gefaess = new Quader(preis, laenge, hoehe); break; case "Pyramide": - g = new Pyramide(p, l, h); + gefaess = new Pyramide(preis, laenge, hoehe); break; } - htw.gefaessKaufen(g); + htw.gefaessKaufen(gefaess); } catch (NichtVorhandenException e) { lblMeldung.setText("Gefaess nicht vorhanden!"); return; @@ -110,15 +137,25 @@ public void kaufen() { lblMeldung.setText(""); } - - // TODO: JavaDoc + /** + * Implementiert die Methode aus dem LagerBeobachter-Interface. + * Wird aufgerufen, wenn sich der Lagerbestand ändert. + * Aktualisiert die Anzeige der Gefäßliste auf der Benutzeroberfläche. + */ @Override public void lagerGeaendert() { this.listeAktualisieren(htw.getGefaessliste()); } + /** + * Startet die JavaFX-Anwendung und zeigt die Benutzeroberfläche an. + * Die Methode wird von der Application-Klasse aufgerufen. + * + * @param stage Die Hauptbühne (Stage) für die JavaFX-Anwendung. + */ @Override public void start(Stage stage) throws Exception { + // Laden des FXML-Dokuments und Setzen des Controllers FXMLLoader loader = new FXMLLoader(getClass().getResource("WunderOberflaeche.fxml")); loader.setController(this); Parent lc = loader.load(); @@ -127,11 +164,10 @@ public void start(Stage stage) throws Exception { stage.setScene(scene); stage.show(); - // Was passiert beim Schließen + // Verhalten beim Schließen des Fensters stage.setOnCloseRequest(e -> { this.htw.produktionStoppen(); this.htw.beobachterEntfernen(this); - //System.exit(0); stage.close(); }); } diff --git a/src/main/java/musterklausur/Zufallsgefaessfabrik.java b/src/main/java/musterklausur/Zufallsgefaessfabrik.java index b2fa9d4..ab268c8 100644 --- a/src/main/java/musterklausur/Zufallsgefaessfabrik.java +++ b/src/main/java/musterklausur/Zufallsgefaessfabrik.java @@ -2,33 +2,86 @@ import java.util.Random; -// TODO: JavaDoc -class Zufallsgefaessfabrik extends Gefaessfabrik { +/** + * Die Klasse `Zufallsgefaessfabrik` ist eine konkrete Implementierung der abstrakten Klasse `Gefaessfabrik` + * und dient dem Abstract Factory Pattern. + *

+ * Diese Fabrik erstellt zufällig Gefäße der verschiedenen Typen (Zylinder, Quader oder Pyramide) mit den + * angegebenen Maßen und dem Preis. Die Erstellung der Gefäße dauert eine bestimmte Zeit, um den asynchronen + * Charakter der Fabrik zu demonstrieren. + *

+ * Die Klasse enthält die statischen Konstanten `ANZAHL_SEKUNDEN`, `MILLISEKUNDEN_PRO_SEKUNDE` und + * `ANZAHL_AN_GEFAESSTYPEN`, die für die Verzögerung und die Auswahl des Gefäßtyps verwendet werden. + *

+ * Die Methode `erstelleGefaess` überschreibt die abstrakte Methode aus der Klasse `Gefaessfabrik` und + * erzeugt ein zufälliges Gefäß vom Typ Zylinder, Quader oder Pyramide basierend auf den übergebenen Maßen + * und dem Preis. Die Erstellung des Gefäßes dauert die in den Konstanten definierte Zeit, um den Effekt + * der Verzögerung zu erzeugen. + *

+ * Wenn die Erstellung des Gefäßes durch die Verzögerung unterbrochen wird (z. B. wenn der Thread unterbrochen + * wird), wird `null` zurückgegeben. + *

+ * Beachte: Die Klasse implementiert das Abstract Factory Pattern, indem sie die abstrakte Methode + * `erstelleGefaess()` überschreibt, um konkrete Gefäße basierend auf den übergebenen Parametern zu erzeugen. + * + * @author frievoe97 + * @see Gefaessfabrik + * @see Gefaessfabrik#erstelleGefaess(double, double, double) + * @see Zylinder + * @see Quader + * @see Pyramide + */ +final class Zufallsgefaessfabrik extends Gefaessfabrik { + /** + * Die Zeitdauer, die benötigt wird, um ein Gefäß zu erzeugen. + */ public static final int ANZAHL_SEKUNDEN = 10; + + /** + * Die Konstante für die Umrechnung von Sekunden in Millisekunden. + */ public static final int MILLISEKUNDEN_PRO_SEKUNDE = 1000; - public static final int ANZAHL_AN_GEFAESTYPEN = 3; - // TODO: JavaDoc + /** + * Die Anzahl der verschiedenen Gefäßtypen (Zylinder, Quader, Pyramide). + */ + public static final int ANZAHL_AN_GEFAESSTYPEN = 3; + + /** + * Erstellt ein zufälliges Gefäß basierend auf den angegebenen Maßen und dem Preis. + * Die Methode überschreibt die abstrakte Methode `erstelleGefaess()` aus der Klasse `Gefaessfabrik`. + * + * @param laenge Die Länge des neuen Gefäßes. + * @param hoehe Die Höhe des neuen Gefäßes. + * @param preis Der Preis pro cm³ des Inhalts des neuen Gefäßes. + * @return Ein zufälliges Gefäß (Zylinder, Quader oder Pyramide) oder null, wenn die Erstellung + * durch die Verzögerung unterbrochen wurde. + */ @Override Gefaess erstelleGefaess(double laenge, double hoehe, double preis) { try { + // Verzögerung, um den asynchronen Charakter der Fabrik zu demonstrieren Thread.sleep(ANZAHL_SEKUNDEN * MILLISEKUNDEN_PRO_SEKUNDE); Random random = new Random(); - switch (random.nextInt(ANZAHL_AN_GEFAESTYPEN)) { - case 0: + // Zufällig einen Gefäßtyp auswählen und das entsprechende Gefäß erzeugen + switch (random.nextInt(ANZAHL_AN_GEFAESSTYPEN)) { + case 0 -> { return new Zylinder(preis, laenge, hoehe); - case 1: + } + case 1 -> { return new Quader(preis, laenge, hoehe); - case 2: + } + case 2 -> { return new Pyramide(preis, laenge, hoehe); + } } } catch (InterruptedException ignored) { - + // Wenn die Erstellung des Gefäßes durch die Verzögerung unterbrochen wurde, wird null zurückgegeben. } return null; } -} \ No newline at end of file +} diff --git a/src/main/java/musterklausur/Zylinder.java b/src/main/java/musterklausur/Zylinder.java index 060bbe8..b0d3a36 100644 --- a/src/main/java/musterklausur/Zylinder.java +++ b/src/main/java/musterklausur/Zylinder.java @@ -1,35 +1,43 @@ package musterklausur; /** - * Zylindrisches Gefäß - * @author Doro + * Die Klasse Zylinder stellt ein zylindrisches Gefäß dar. + * Sie erbt von der abstrakten Klasse Gefaess. * + * @author Doro */ -public class Zylinder extends Gefaess { - /** - * Durchmesser in cm - */ - private double durchmesser; - /** - * Höhe des Zylinders in cm - */ - private double hoehe; +public final class Zylinder extends Gefaess { + /** + * Durchmesser des Zylinders in cm. + */ + private final double durchmesser; + + /** + * Höhe des Zylinders in cm. + */ + private final double hoehe; - /** - * erstellt einen Zylinder mit den angegebenen Werten - * @param preisInhalt - * @param durchmesser - * @param hoehe - */ - public Zylinder(double preisInhalt, double durchmesser, double hoehe) { - super(preisInhalt); - this.durchmesser = durchmesser; - this.hoehe = hoehe; - } + /** + * Erzeugt einen Zylinder mit den angegebenen Werten. + * + * @param preisInhalt Der Preis pro cm³ des Inhalts des Zylinders. + * @param durchmesser Der Durchmesser des Zylinders in cm. + * @param hoehe Die Höhe des Zylinders in cm. + */ + public Zylinder(double preisInhalt, double durchmesser, double hoehe) { + super(preisInhalt); + this.durchmesser = durchmesser; + this.hoehe = hoehe; + } - // TODO: JavaDoc - @Override - double getVolumen() { - return (Math.PI/4) * Math.pow(this.durchmesser, 2) * this.hoehe; - } + /** + * Berechnet das Volumen des Zylinders basierend auf den angegebenen Werten + * für den Durchmesser und die Höhe. + * + * @return Das Volumen des Zylinders. + */ + @Override + double getVolumen() { + return (Math.PI / 4) * Math.pow(this.durchmesser, 2) * this.hoehe; + } }