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
// 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.nachname = nachname;
this.kundennummer = kundennummer;

View File

@ -1,15 +1,16 @@
class Creator {
// Factory-Methode für Benutzer
static Benutzer factoryBenutzer(String name, String nachname, int kundennummer, String art) {
if (art.equals("e")) {
return new Benutzer.Erwachsener(name, nachname, kundennummer);
} else if (art.equals("s")) {
return new Benutzer.SchuelerStudent(name, nachname, kundennummer, art);
if (art.equalsIgnoreCase("e")) {
return new Benutzer.Erwachsener(name, nachname, kundennummer); // Erstelle einen Erwachsenen
} else if (art.equalsIgnoreCase("s")) {
return new Benutzer.SchuelerStudent(name, nachname, kundennummer, art); // Erstelle einen Schüler/Studenten
} 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) {
switch (art.toLowerCase()) {
case "buch":
@ -26,4 +27,4 @@ class Creator {
throw new IllegalArgumentException("Unbekannter Medientyp: " + art);
}
}
}
}

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 static void main(String[] args) {
// Erstelle die Instanzen
Creator creator = new Creator();
Verwaltung verwaltung = new Verwaltung();
// Medienobjekte hinzufügen
verwaltung.mediensListe.add(creator.factoryMedien("Java Programmierung", "Max Mustermann", 1, "buch", 2020));
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("The Witcher 3", "CD Projekt", 10, "videospiel", 0));
// Ui mit der Verwaltung-Instanz initialisieren7
Ui ui = new Ui(verwaltung);
ui.anmeldung();
// Erstelle die Fassade mit der Verwaltung
Fassade fassade = new Fassade(verwaltung);
// 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.temporal.ChronoUnit;
import java.util.*;
import java.util.Scanner;
public class Ui {
private final Scanner scanner = new Scanner(System.in);
private final Verwaltung verwaltung;
// Zeitversatz für Tests
private LocalDate aktuelleZeit = LocalDate.now();
private final Fassade fassade;
private final Scanner scanner;
public Ui(Verwaltung verwaltung) {
this.verwaltung = verwaltung;
public Ui(Fassade fassade) {
this.fassade = fassade;
this.scanner = new Scanner(System.in);
}
void anmeldung() {
boolean running = true;
while (running) {
System.out.println("Willkommen! Bitte wählen Sie eine Option:");
System.out.println("1: Durchsuchen der Medien");
System.out.println("2: Ausleihen eines Gegenstandes");
System.out.println("3: Rückgabe eines Gegenstandes");
System.out.println("4: Ausgeliehene Gegenstände und Gebühren anzeigen");
System.out.println("5: Verlängern der Leihfrist");
System.out.println("6: Verbuchen von überfälligen Gebühren (Admin)");
System.out.println("7: Registrieren");
System.out.println("8: Anmelden");
System.out.println("9: Zeit verschieben (Testoption)");
System.out.println("0: Programm beenden");
public void starten() {
boolean weiter = true;
while (weiter) {
System.out.println("Bitte wählen Sie eine Option:");
System.out.println("1. Medien durchsuchen");
System.out.println("2. Benutzer registrieren");
System.out.println("3. Benutzer anmelden");
System.out.println("4. Medien ausleihen");
System.out.println("5. Medien zurückgeben");
System.out.println("6. Medien verlängern");
System.out.println("7. Gebühren einsehen");
System.out.println("8. Zeit verschieben");
System.out.println("9. Beenden");
int menue = scanner.nextInt();
scanner.nextLine(); // Leert den Puffer nach nextInt()
int auswahl = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
switch (menue) {
case 1 -> suchenNachMedien();
case 2 -> ausleihen();
case 3 -> rueckgabeDurchfuehren();
case 4 -> gebuehrenEinsehen();
case 5 -> verlaengern();
case 6 -> adminrechte();
case 7 -> registrieren();
case 8 -> anmelden();
case 9 -> zeitVerschieben();
case 0 -> {
System.out.println("Programm wird beendet. Auf Wiedersehen!");
running = false;
}
default -> System.out.println("Ungültige Auswahl. Bitte versuchen Sie es erneut.");
switch (auswahl) {
case 1: durchsuchenMedien(); break;
case 2: registrierenBenutzer(); break;
case 3: anmeldenBenutzer(); break;
case 4: ausleihen(); break;
case 5: rueckgabe(); break;
case 6: verlaengern(); break;
case 7: gebuehrenEinsehen(); break;
case 8: zeitVerschieben(); break;
case 9: weiter = false; break;
default: System.out.println("Ungültige Auswahl."); break;
}
}
}
private void suchenNachMedien() {
System.out.println("Bitte geben Sie stichwortartig an, wonach Sie suchen:");
private void durchsuchenMedien() {
System.out.print("Suchbegriff (oder 'all' für alle Medien): ");
String suchbegriff = scanner.nextLine();
List<Medien> gefundeneMedien = Verwaltung.durchsuchenMedien(verwaltung.mediensListe, suchbegriff);
if (gefundeneMedien.isEmpty()) {
var ergebnisse = fassade.durchsuchenMedien(suchbegriff);
if (ergebnisse.isEmpty()) {
System.out.println("Keine Medien gefunden.");
} else {
System.out.println("Gefundene Medien:");
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.");
}
}
ergebnisse.forEach(m -> System.out.println(m));
}
}
private void registrieren() {
System.out.print("Geben Sie Ihren Vornamen ein: ");
String name = scanner.nextLine();
System.out.print("Geben Sie Ihren Nachnamen ein: ");
private void registrierenBenutzer() {
System.out.print("Vorname: ");
String vorname = scanner.nextLine();
System.out.print("Nachname: ");
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: ");
String artInput = scanner.nextLine();
// Erstelle den Benutzer über die Creator-Fabrikmethode
Benutzer benutzer = Creator.factoryBenutzer(vorname, nachname, 0, art); // Kundennummer könnte hier 0 sein, wenn sie noch nicht vergeben wurde.
int genkundennummer = verwaltung.generiereEindeutigeKundennummer();
Benutzer neuerBenutzer = Creator.factoryBenutzer(name, nachname, genkundennummer, artInput.toLowerCase());
if (neuerBenutzer != null) {
verwaltung.benutzerListe.add(neuerBenutzer);
System.out.println("Registrierung erfolgreich! Ihre Kundennummer lautet: " + genkundennummer);
if (benutzer != null) {
fassade.registriereBenutzer(benutzer);
System.out.println("Benutzer erfolgreich registriert.");
} 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()
.filter(benutzer -> benutzer.getKundennummer() == eingabeKundennummer)
.findFirst();
if (benutzerOpt.isPresent()) {
System.out.println("Willkommen zurück, " + benutzerOpt.get().getName());
return benutzerOpt.get();
private void anmeldenBenutzer() {
System.out.print("Kundennummer: ");
int kundennummer = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
if (benutzer != null) {
System.out.println("Benutzer angemeldet: " + benutzer.getName() + " " + benutzer.getNachname());
} else {
System.out.println("Kundennummer nicht gefunden.");
return null;
System.out.println("Benutzer nicht gefunden.");
}
}
private void ausleihen() {
Benutzer benutzer = anmelden();
if (benutzer == null) {
System.out.println("Sie müssen sich zuerst anmelden.");
return;
}
System.out.print("Geben Sie die ID des gewünschten Mediums ein: ");
int id = scanner.nextInt();
System.out.print("Medien ID: ");
int medienId = scanner.nextInt();
System.out.print("Kundennummer: ");
int kundennummer = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
Optional<Medien> optionalMedien = verwaltung.mediensListe.stream()
.filter(medien -> medien.getId() == id)
.findFirst();
if (optionalMedien.isPresent()) {
Medien medien = optionalMedien.get();
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.");
}
Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
if (benutzer != null) {
System.out.print("Rückgabedatum (yyyy-MM-dd): ");
LocalDate rueckgabeDatum = LocalDate.parse(scanner.nextLine());
fassade.ausleihen(medienId, benutzer, LocalDate.now(), rueckgabeDatum);
System.out.println("Ausleihe erfolgreich.");
} else {
System.out.println("Medium mit dieser ID nicht gefunden.");
System.out.println("Benutzer nicht gefunden.");
}
}
private void rueckgabeDurchfuehren() {
Benutzer benutzer = anmelden();
if (benutzer == null) {
System.out.println("Sie müssen sich zuerst anmelden.");
return;
}
System.out.print("Geben Sie die ID des Mediums ein, das Sie zurückgeben möchten: ");
int id = scanner.nextInt();
private void rueckgabe() {
System.out.print("Medien ID: ");
int medienId = scanner.nextInt();
System.out.print("Kundennummer: ");
int kundennummer = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
Optional<Medien> optionalMedien = verwaltung.mediensListe.stream()
.filter(medien -> medien.getId() == id)
.findFirst();
if (optionalMedien.isPresent()) {
verwaltung.rueckgabe(id, benutzer, aktuelleZeit);
System.out.println("Das Medium wurde erfolgreich zurückgegeben.");
Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
if (benutzer != null) {
System.out.print("Rückgabedatum (yyyy-MM-dd): ");
LocalDate rueckgabeDatum = LocalDate.parse(scanner.nextLine());
fassade.rueckgabe(medienId, benutzer, rueckgabeDatum);
System.out.println("Rückgabe erfolgreich.");
} else {
System.out.println("Medium mit dieser ID nicht gefunden.");
System.out.println("Benutzer nicht gefunden.");
}
}
private void verlaengern() {
Benutzer benutzer = anmelden();
if (benutzer == null) {
System.out.println("Sie müssen sich zuerst anmelden.");
return;
}
System.out.print("Geben Sie die ID des Mediums ein, das Sie verlängern möchten: ");
int id = scanner.nextInt();
System.out.print("Medien ID: ");
int medienId = scanner.nextInt();
System.out.print("Kundennummer: ");
int kundennummer = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
Optional<Medien> optionalMedien = verwaltung.mediensListe.stream()
.filter(medien -> medien.getId() == id)
.findFirst();
if (optionalMedien.isPresent()) {
verwaltung.verlängern(optionalMedien.get(), benutzer);
System.out.println("Das Medium wurde verlängert.");
Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
if (benutzer != null) {
fassade.verlaengern(medienId, benutzer);
} 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() {
Benutzer benutzer = anmelden();
if (benutzer == null) {
System.out.println("Sie müssen sich zuerst anmelden.");
return;
}
System.out.print("Kundennummer: ");
int kundennummer = scanner.nextInt();
scanner.nextLine(); // Puffer leeren
System.out.println("Ihre ausstehenden Gebühren:");
List<Aausleihe> ausleihen = verwaltung.getAusleihenByBenutzer(benutzer);
if (ausleihen.isEmpty()) {
System.out.println("Sie haben keine ausgeliehenen Medien.");
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.");
Benutzer benutzer = fassade.anmeldenBenutzer(kundennummer);
if (benutzer != null) {
System.out.println("Ausstehende Gebühren: " + benutzer.getGebuehren() + "€");
} else {
System.out.println("Benutzer nicht gefunden.");
}
}
private void zeitVerschieben() {
System.out.println("Aktuelles Datum: " + aktuelleZeit);
System.out.print("Geben Sie das neue Datum im Format JJJJ-MM-TT ein: ");
String neuesDatum = scanner.nextLine();
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.");
}
System.out.print("Neue Zeit (yyyy-MM-dd): ");
String datum = scanner.nextLine();
fassade.zeitVerschieben(LocalDate.parse(datum));
System.out.println("Aktuelles Datum wurde auf " + datum + " geändert.");
}
}

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) {
// Überprüfen, ob das richtige Medium und der richtige Benutzer vorliegen
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());
medien.maxVerlängerungen--;
medien.aktuelleVerlängerungen++;
@ -187,6 +187,7 @@ public class Verwaltung {
public double berechneGebuehren(Aausleihe aausleihe, LocalDate aktuellesDatum) {
long tageÜberfällig = ChronoUnit.DAYS.between(aausleihe.getRueckgabeDatum(), aktuellesDatum);
if (tageÜberfällig <= 0) {