ich habe versucht die fassade wieder einzu bauen damit die ui weniger code und meher trennung bekommt.

main
Zabih Mansuri 2024-12-01 18:16:28 +01:00
parent e17196354d
commit 5f61cdc46f
6 changed files with 199 additions and 247 deletions

View File

@ -8,7 +8,7 @@ abstract class Benutzer {
private double gebuehren; // Aktuelle ausstehende Gebühren des Benutzers private double gebuehren; // Aktuelle ausstehende Gebühren des Benutzers
// Konstruktor // Konstruktor
public Benutzer(String name, String nachname, int kundennummer, String art) { public Benutzer(String name, String nachname, int kundennummer, String art) {
this.name = name; this.name = name;
this.nachname = nachname; this.nachname = nachname;
this.kundennummer = kundennummer; this.kundennummer = kundennummer;

View File

@ -1,15 +1,16 @@
class Creator { class Creator {
// Factory-Methode für Benutzer
static Benutzer factoryBenutzer(String name, String nachname, int kundennummer, String art) { static Benutzer factoryBenutzer(String name, String nachname, int kundennummer, String art) {
if (art.equals("e")) { if (art.equalsIgnoreCase("e")) {
return new Benutzer.Erwachsener(name, nachname, kundennummer); return new Benutzer.Erwachsener(name, nachname, kundennummer); // Erstelle einen Erwachsenen
} else if (art.equals("s")) { } else if (art.equalsIgnoreCase("s")) {
return new Benutzer.SchuelerStudent(name, nachname, kundennummer, art); return new Benutzer.SchuelerStudent(name, nachname, kundennummer, art); // Erstelle einen Schüler/Studenten
} else { } else {
return null; return null; // Unbekannte Benutzerart
} }
} }
// Factory-Methode für Medien
public static Medien factoryMedien(String name, String regisseur, int id, String art, int erscheinungsjahr) { public static Medien factoryMedien(String name, String regisseur, int id, String art, int erscheinungsjahr) {
switch (art.toLowerCase()) { switch (art.toLowerCase()) {
case "buch": case "buch":

77
Fassade.java 100644
View File

@ -0,0 +1,77 @@
import java.time.LocalDate;
import java.util.List;
public class Fassade {
private final Verwaltung verwaltung;
private LocalDate aktuellesDatum;
// Konstruktor
public Fassade(Verwaltung verwaltung) {
this.verwaltung = verwaltung;
this.aktuellesDatum = LocalDate.now(); // Initiales Datum ist das heutige Datum
}
// Benutzer registrieren
public void registriereBenutzer(Benutzer benutzer) {
verwaltung.addBenutzer(benutzer); // Benutzer zur Verwaltung hinzufügen
}
// Benutzer anmelden
public Benutzer anmeldenBenutzer(int kundennummer) {
return verwaltung.benutzerListe.stream()
.filter(b -> b.getKundennummer() == kundennummer)
.findFirst()
.orElse(null); // Gibt null zurück, wenn Benutzer nicht gefunden wurde
}
// Medien durchsuchen
public List<Medien> durchsuchenMedien(String suchbegriff) {
// Rufe die Methode in der Verwaltung auf und übergebe die medienListe
return verwaltung.durchsuchenMedien(verwaltung.mediensListe, suchbegriff);
}
// Medien ausleihen
public void ausleihen(int medienId, Benutzer benutzer, LocalDate ausleihDatum, LocalDate rueckgabeDatum) {
Medien medien = verwaltung.mediensListe.stream()
.filter(m -> m.getId() == medienId)
.findFirst()
.orElse(null);
if (medien != null) {
verwaltung.addAL(medien, benutzer, ausleihDatum, rueckgabeDatum); // Leihe das Medium aus
} else {
System.out.println("Medien nicht gefunden.");
}
}
// Medien zurückgeben
public void rueckgabe(int medienId, Benutzer benutzer, LocalDate rueckgabeDatum) {
verwaltung.rueckgabe(medienId, benutzer, rueckgabeDatum); // Rückgabe des Mediums
}
// Medien verlängern
public void verlaengern(int medienId, Benutzer benutzer) {
Medien medien = verwaltung.mediensListe.stream()
.filter(m -> m.getId() == medienId)
.findFirst()
.orElse(null);
if (medien != null) {
verwaltung.verlängern(medien, benutzer); // Verlängere die Leihfrist
} else {
System.out.println("Medien nicht gefunden.");
}
}
// Zeit verschieben
public void zeitVerschieben(LocalDate neuesDatum) {
this.aktuellesDatum = neuesDatum; // Aktuelles Datum auf das neue Datum setzen
}
// Aktuelles Datum abrufen
public LocalDate getAktuellesDatum() {
return aktuellesDatum; // Gibt das aktuelle Datum zurück
}
}

View File

@ -1,9 +1,9 @@
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
// Erstelle die Instanzen
Creator creator = new Creator(); Creator creator = new Creator();
Verwaltung verwaltung = new Verwaltung(); Verwaltung verwaltung = new Verwaltung();
// Medienobjekte hinzufügen // Medienobjekte hinzufügen
verwaltung.mediensListe.add(creator.factoryMedien("Java Programmierung", "Max Mustermann", 1, "buch", 2020)); verwaltung.mediensListe.add(creator.factoryMedien("Java Programmierung", "Max Mustermann", 1, "buch", 2020));
verwaltung.mediensListe.add(creator.factoryMedien("Datenstrukturen", "Julia Schmidt", 2, "buch", 2018)); verwaltung.mediensListe.add(creator.factoryMedien("Datenstrukturen", "Julia Schmidt", 2, "buch", 2018));
@ -16,8 +16,13 @@ public class Main {
verwaltung.mediensListe.add(creator.factoryMedien("Minecraft", "Mojang", 9, "videospiel", 0)); verwaltung.mediensListe.add(creator.factoryMedien("Minecraft", "Mojang", 9, "videospiel", 0));
verwaltung.mediensListe.add(creator.factoryMedien("The Witcher 3", "CD Projekt", 10, "videospiel", 0)); verwaltung.mediensListe.add(creator.factoryMedien("The Witcher 3", "CD Projekt", 10, "videospiel", 0));
// Ui mit der Verwaltung-Instanz initialisieren7 // Erstelle die Fassade mit der Verwaltung
Ui ui = new Ui(verwaltung); Fassade fassade = new Fassade(verwaltung);
ui.anmeldung();
// UI mit der Fassade initialisieren
Ui ui = new Ui(fassade);
// Anmeldung starten
ui.starten();
} }
} }

332
Ui.java
View File

@ -1,291 +1,159 @@
import java.time.LocalDate; import java.time.LocalDate;
import java.time.temporal.ChronoUnit; import java.util.Scanner;
import java.util.*;
public class Ui { public class Ui {
private final Scanner scanner = new Scanner(System.in);
private final Verwaltung verwaltung;
// Zeitversatz für Tests private final Fassade fassade;
private LocalDate aktuelleZeit = LocalDate.now(); private final Scanner scanner;
public Ui(Verwaltung verwaltung) { public Ui(Fassade fassade) {
this.verwaltung = verwaltung; this.fassade = fassade;
this.scanner = new Scanner(System.in);
} }
void anmeldung() { public void starten() {
boolean running = true; boolean weiter = true;
while (running) { while (weiter) {
System.out.println("Willkommen! Bitte wählen Sie eine Option:"); System.out.println("Bitte wählen Sie eine Option:");
System.out.println("1: Durchsuchen der Medien"); System.out.println("1. Medien durchsuchen");
System.out.println("2: Ausleihen eines Gegenstandes"); System.out.println("2. Benutzer registrieren");
System.out.println("3: Rückgabe eines Gegenstandes"); System.out.println("3. Benutzer anmelden");
System.out.println("4: Ausgeliehene Gegenstände und Gebühren anzeigen"); System.out.println("4. Medien ausleihen");
System.out.println("5: Verlängern der Leihfrist"); System.out.println("5. Medien zurückgeben");
System.out.println("6: Verbuchen von überfälligen Gebühren (Admin)"); System.out.println("6. Medien verlängern");
System.out.println("7: Registrieren"); System.out.println("7. Gebühren einsehen");
System.out.println("8: Anmelden"); System.out.println("8. Zeit verschieben");
System.out.println("9: Zeit verschieben (Testoption)"); System.out.println("9. Beenden");
System.out.println("0: Programm beenden");
int menue = scanner.nextInt(); int auswahl = scanner.nextInt();
scanner.nextLine(); // Leert den Puffer nach nextInt() scanner.nextLine(); // Puffer leeren
switch (menue) { switch (auswahl) {
case 1 -> suchenNachMedien(); case 1: durchsuchenMedien(); break;
case 2 -> ausleihen(); case 2: registrierenBenutzer(); break;
case 3 -> rueckgabeDurchfuehren(); case 3: anmeldenBenutzer(); break;
case 4 -> gebuehrenEinsehen(); case 4: ausleihen(); break;
case 5 -> verlaengern(); case 5: rueckgabe(); break;
case 6 -> adminrechte(); case 6: verlaengern(); break;
case 7 -> registrieren(); case 7: gebuehrenEinsehen(); break;
case 8 -> anmelden(); case 8: zeitVerschieben(); break;
case 9 -> zeitVerschieben(); case 9: weiter = false; break;
case 0 -> { default: System.out.println("Ungültige Auswahl."); break;
System.out.println("Programm wird beendet. Auf Wiedersehen!");
running = false;
}
default -> System.out.println("Ungültige Auswahl. Bitte versuchen Sie es erneut.");
} }
} }
} }
private void suchenNachMedien() { private void durchsuchenMedien() {
System.out.println("Bitte geben Sie stichwortartig an, wonach Sie suchen:"); System.out.print("Suchbegriff (oder 'all' für alle Medien): ");
String suchbegriff = scanner.nextLine(); String suchbegriff = scanner.nextLine();
var ergebnisse = fassade.durchsuchenMedien(suchbegriff);
List<Medien> gefundeneMedien = Verwaltung.durchsuchenMedien(verwaltung.mediensListe, suchbegriff); if (ergebnisse.isEmpty()) {
if (gefundeneMedien.isEmpty()) {
System.out.println("Keine Medien gefunden."); System.out.println("Keine Medien gefunden.");
} else { } else {
System.out.println("Gefundene Medien:"); ergebnisse.forEach(m -> System.out.println(m));
for (Medien medien : gefundeneMedien) {
System.out.print(medien.getName());
if (medien.istAusgeliehen) {
Optional<Aausleihe> ausleiheOpt = verwaltung.ausliste.stream()
.filter(ausleihe -> ausleihe.getMedien().equals(medien))
.findFirst();
if (ausleiheOpt.isPresent()) {
Aausleihe ausleihe = ausleiheOpt.get();
LocalDate rueckgabedatum = ausleihe.getDate().plusWeeks(medien.frist);
System.out.println(" ist ausgeliehen. Rückgabedatum: " + rueckgabedatum);
}
} else {
System.out.println(" ist verfügbar.");
}
}
} }
} }
private void registrieren() { private void registrierenBenutzer() {
System.out.print("Geben Sie Ihren Vornamen ein: "); System.out.print("Vorname: ");
String name = scanner.nextLine(); String vorname = scanner.nextLine();
System.out.print("Nachname: ");
System.out.print("Geben Sie Ihren Nachnamen ein: ");
String nachname = scanner.nextLine(); String nachname = scanner.nextLine();
System.out.print("Benutzertyp (e für Erwachsener, s für Schüler/Student): ");
String art = scanner.nextLine();
System.out.print("Für Student geben Sie 's' und für Erwachsener 'e' ein: "); // Erstelle den Benutzer über die Creator-Fabrikmethode
String artInput = scanner.nextLine(); Benutzer benutzer = Creator.factoryBenutzer(vorname, nachname, 0, art); // Kundennummer könnte hier 0 sein, wenn sie noch nicht vergeben wurde.
int genkundennummer = verwaltung.generiereEindeutigeKundennummer(); if (benutzer != null) {
Benutzer neuerBenutzer = Creator.factoryBenutzer(name, nachname, genkundennummer, artInput.toLowerCase()); fassade.registriereBenutzer(benutzer);
System.out.println("Benutzer erfolgreich registriert.");
if (neuerBenutzer != null) {
verwaltung.benutzerListe.add(neuerBenutzer);
System.out.println("Registrierung erfolgreich! Ihre Kundennummer lautet: " + genkundennummer);
} else { } else {
System.out.println("Ungültige Art. Versuchen Sie es erneut."); System.out.println("Fehler: Ungültiger Benutzertyp.");
} }
} }
private Benutzer anmelden() {
System.out.print("Geben Sie Ihre Kundennummer zur Anmeldung ein: ");
int eingabeKundennummer = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
Optional<Benutzer> benutzerOpt = verwaltung.benutzerListe.stream() private void anmeldenBenutzer() {
.filter(benutzer -> benutzer.getKundennummer() == eingabeKundennummer) System.out.print("Kundennummer: ");
.findFirst(); int kundennummer = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
if (benutzerOpt.isPresent()) { Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
System.out.println("Willkommen zurück, " + benutzerOpt.get().getName()); if (benutzer != null) {
return benutzerOpt.get(); System.out.println("Benutzer angemeldet: " + benutzer.getName() + " " + benutzer.getNachname());
} else { } else {
System.out.println("Kundennummer nicht gefunden."); System.out.println("Benutzer nicht gefunden.");
return null;
} }
} }
private void ausleihen() { private void ausleihen() {
Benutzer benutzer = anmelden(); System.out.print("Medien ID: ");
if (benutzer == null) { int medienId = scanner.nextInt();
System.out.println("Sie müssen sich zuerst anmelden."); System.out.print("Kundennummer: ");
return; int kundennummer = scanner.nextInt();
}
System.out.print("Geben Sie die ID des gewünschten Mediums ein: ");
int id = scanner.nextInt();
scanner.nextLine(); // Puffer leeren scanner.nextLine(); // Puffer leeren
Optional<Medien> optionalMedien = verwaltung.mediensListe.stream() Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
.filter(medien -> medien.getId() == id) if (benutzer != null) {
.findFirst(); System.out.print("Rückgabedatum (yyyy-MM-dd): ");
LocalDate rueckgabeDatum = LocalDate.parse(scanner.nextLine());
if (optionalMedien.isPresent()) { fassade.ausleihen(medienId, benutzer, LocalDate.now(), rueckgabeDatum);
Medien medien = optionalMedien.get(); System.out.println("Ausleihe erfolgreich.");
if (!medien.istAusgeliehen()) {
verwaltung.addAL(medien, benutzer, aktuelleZeit, null);
System.out.println("Das Medium wurde erfolgreich ausgeliehen.");
} else {
System.out.println("Das Medium ist bereits ausgeliehen.");
}
} else { } else {
System.out.println("Medium mit dieser ID nicht gefunden."); System.out.println("Benutzer nicht gefunden.");
} }
} }
private void rueckgabeDurchfuehren() { private void rueckgabe() {
Benutzer benutzer = anmelden(); System.out.print("Medien ID: ");
if (benutzer == null) { int medienId = scanner.nextInt();
System.out.println("Sie müssen sich zuerst anmelden."); System.out.print("Kundennummer: ");
return; int kundennummer = scanner.nextInt();
}
System.out.print("Geben Sie die ID des Mediums ein, das Sie zurückgeben möchten: ");
int id = scanner.nextInt();
scanner.nextLine(); // Puffer leeren scanner.nextLine(); // Puffer leeren
Optional<Medien> optionalMedien = verwaltung.mediensListe.stream() Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
.filter(medien -> medien.getId() == id) if (benutzer != null) {
.findFirst(); System.out.print("Rückgabedatum (yyyy-MM-dd): ");
LocalDate rueckgabeDatum = LocalDate.parse(scanner.nextLine());
if (optionalMedien.isPresent()) { fassade.rueckgabe(medienId, benutzer, rueckgabeDatum);
verwaltung.rueckgabe(id, benutzer, aktuelleZeit); System.out.println("Rückgabe erfolgreich.");
System.out.println("Das Medium wurde erfolgreich zurückgegeben.");
} else { } else {
System.out.println("Medium mit dieser ID nicht gefunden."); System.out.println("Benutzer nicht gefunden.");
} }
} }
private void verlaengern() { private void verlaengern() {
Benutzer benutzer = anmelden(); System.out.print("Medien ID: ");
if (benutzer == null) { int medienId = scanner.nextInt();
System.out.println("Sie müssen sich zuerst anmelden."); System.out.print("Kundennummer: ");
return; int kundennummer = scanner.nextInt();
}
System.out.print("Geben Sie die ID des Mediums ein, das Sie verlängern möchten: ");
int id = scanner.nextInt();
scanner.nextLine(); // Puffer leeren scanner.nextLine(); // Puffer leeren
Optional<Medien> optionalMedien = verwaltung.mediensListe.stream() Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
.filter(medien -> medien.getId() == id) if (benutzer != null) {
.findFirst(); fassade.verlaengern(medienId, benutzer);
if (optionalMedien.isPresent()) {
verwaltung.verlängern(optionalMedien.get(), benutzer);
System.out.println("Das Medium wurde verlängert.");
} else { } else {
System.out.println("Medium mit dieser ID nicht gefunden."); System.out.println("Benutzer nicht gefunden.");
} }
} }
private void adminrechte() {
System.out.print("Geben Sie den Admin-Benutzernamen ein: ");
String benutzername = scanner.nextLine();
System.out.print("Geben Sie das Admin-Passwort ein: ");
String passwort = scanner.nextLine();
if (benutzername.equals("admin") && passwort.equals("admin123")) {
System.out.println("Admin-Login erfolgreich.");
verbucheUeberfaelligeGebuehren();
} else {
System.out.println("Falsche Admin-Zugangsdaten.");
}
System.out.println("möchten sie zahlungen löschem geben sie benutzer id ein");
int id=scanner.nextInt();
}
private void verbucheUeberfaelligeGebuehren() {
System.out.println("Verbuchen überfälliger Gebühren:");
for (Aausleihe ausleihe : verwaltung.ausliste) {
Medien medien = ausleihe.getMedien();
Benutzer benutzer = ausleihe.getBenutzer();
LocalDate faelligkeitsdatum = ausleihe.getDate().plusDays(medien.frist);
if (aktuelleZeit.isAfter(faelligkeitsdatum)) {
long ueberfaelligeWochen = ChronoUnit.DAYS.between(faelligkeitsdatum, aktuelleZeit);
double gebuehr = ueberfaelligeWochen;
System.out.println("Benutzer: " + benutzer.getName() + ", Medium: " + medien.getName() +
", Überfällige Wochen: " + ueberfaelligeWochen + ", Gebühr: " + gebuehr + " EUR");
}
}
}
private void gebuehrenEinsehen() { private void gebuehrenEinsehen() {
Benutzer benutzer = anmelden(); System.out.print("Kundennummer: ");
if (benutzer == null) { int kundennummer = scanner.nextInt();
System.out.println("Sie müssen sich zuerst anmelden."); scanner.nextLine(); // Puffer leeren
return;
}
System.out.println("Ihre ausstehenden Gebühren:"); Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
List<Aausleihe> ausleihen = verwaltung.getAusleihenByBenutzer(benutzer); if (benutzer != null) {
System.out.println("Ausstehende Gebühren: " + benutzer.getGebuehren() + "€");
if (ausleihen.isEmpty()) { } else {
System.out.println("Sie haben keine ausgeliehenen Medien."); System.out.println("Benutzer nicht gefunden.");
return;
}
boolean hatAusgelieheneMedien = false;
for (Aausleihe ausleihe : ausleihen) {
Medien medien = ausleihe.getMedien();
// Prüfen, ob das Medium ausgeliehen ist
if (!medien.istAusgeliehen()) {
continue; // Überspringt Medien, die nicht ausgeliehen sind
}
hatAusgelieheneMedien = true; // Mindestens ein Medium ist ausgeliehen
LocalDate faelligkeitsdatum = ausleihe.getDate().plusWeeks(medien.frist);
double gebuehr = 0;
// Gebühren berechnen, wenn das Medium überfällig ist
if (aktuelleZeit.isAfter(faelligkeitsdatum)) {
long ueberfaelligeTage = ChronoUnit.DAYS.between(faelligkeitsdatum, aktuelleZeit);
gebuehr = ueberfaelligeTage * 2.0; // 2 EUR pro überfälligem Tag
}
// Details zum Medium ausgeben
System.out.println("Medium: " + medien.getName() +
", Fälligkeitsdatum: " + faelligkeitsdatum +
", Gebühr: " + gebuehr + " EUR");
}
if (!hatAusgelieheneMedien) {
System.out.println("Sie haben keine ausgeliehenen Medien.");
} }
} }
private void zeitVerschieben() { private void zeitVerschieben() {
System.out.println("Aktuelles Datum: " + aktuelleZeit); System.out.print("Neue Zeit (yyyy-MM-dd): ");
System.out.print("Geben Sie das neue Datum im Format JJJJ-MM-TT ein: "); String datum = scanner.nextLine();
String neuesDatum = scanner.nextLine(); fassade.zeitVerschieben(LocalDate.parse(datum));
System.out.println("Aktuelles Datum wurde auf " + datum + " geändert.");
try {
aktuelleZeit = LocalDate.parse(neuesDatum);
System.out.println("Die Zeit wurde erfolgreich auf " + aktuelleZeit + " geändert.");
} catch (Exception e) {
System.out.println("Ungültiges Datum. Bitte versuchen Sie es erneut.");
}
} }
} }

View File

@ -164,11 +164,11 @@ public class Verwaltung {
} }
public void verlängern(Medien medien, Benutzer benutzer) { public void verlängern(Medien medien, Benutzer benutzer) {
for (Aausleihe aausleihe : ausliste) { for (Aausleihe aausleihe : ausliste) {
// Überprüfen, ob das richtige Medium und der richtige Benutzer vorliegen // Überprüfen, ob das richtige Medium und der richtige Benutzer vorliegen
if (aausleihe.getMedien().equals(medien) && aausleihe.getBenutzer().equals(benutzer)) { if (aausleihe.getMedien().equals(medien) && aausleihe.getBenutzer().equals(benutzer)) {
if (medien.verlängern()&& medien.kannVerlängern()) { // Medien.verlängern() prüft, ob noch Verlängerungen möglich sind if (medien.verlängern() && medien.kannVerlängern()) { // Medien.verlängern() prüft, ob noch Verlängerungen möglich sind
System.out.println("Das Medium wurde erfolgreich verlängert. Aktuelle Verlängerungen: " + medien.getMaxVerlängerungen()); System.out.println("Das Medium wurde erfolgreich verlängert. Aktuelle Verlängerungen: " + medien.getMaxVerlängerungen());
medien.maxVerlängerungen--; medien.maxVerlängerungen--;
medien.aktuelleVerlängerungen++; medien.aktuelleVerlängerungen++;
@ -187,6 +187,7 @@ public class Verwaltung {
public double berechneGebuehren(Aausleihe aausleihe, LocalDate aktuellesDatum) { public double berechneGebuehren(Aausleihe aausleihe, LocalDate aktuellesDatum) {
long tageÜberfällig = ChronoUnit.DAYS.between(aausleihe.getRueckgabeDatum(), aktuellesDatum); long tageÜberfällig = ChronoUnit.DAYS.between(aausleihe.getRueckgabeDatum(), aktuellesDatum);
if (tageÜberfällig <= 0) { if (tageÜberfällig <= 0) {