From 54bc0bf9f89bdb61ea6396db6a6173887bebd03c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leon=20L=C3=B6hle?= <3010261@hs-mannheim.de> Date: Fri, 15 Nov 2024 16:21:42 +0100 Subject: [PATCH] =?UTF-8?q?Verbesserung=20der=20Koh=C3=A4sion=20und=20der?= =?UTF-8?q?=20Funktionalit=C3=A4t=20durch=20Lambdas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Biblio/src/Bibliothek/Admin.java | 42 ++++++++++++- .../src/Bibliothek/Bibliotheksverwaltung.java | 63 +++++++++++++++++++ Biblio/src/Bibliothek/Brettspiel.java | 13 ++-- Biblio/src/Bibliothek/Buch.java | 11 +++- Biblio/src/Bibliothek/CD.java | 17 +++-- Biblio/src/Bibliothek/DVD.java | 11 +++- Biblio/src/Bibliothek/Kunde.java | 61 ++++++++++++++++++ Biblio/src/Bibliothek/Medien.java | 30 ++++++--- Biblio/src/Bibliothek/User.java | 48 +++++++++++++- Biblio/src/Bibliothek/Videospiel.java | 19 +++--- 10 files changed, 283 insertions(+), 32 deletions(-) create mode 100644 Biblio/src/Bibliothek/Kunde.java diff --git a/Biblio/src/Bibliothek/Admin.java b/Biblio/src/Bibliothek/Admin.java index bc6fd45..1cad231 100644 --- a/Biblio/src/Bibliothek/Admin.java +++ b/Biblio/src/Bibliothek/Admin.java @@ -1,4 +1,44 @@ package Bibliothek; -public class Admin { +import java.util.function.Consumer; + +public class Admin extends User { + + public Admin(String id, String name) { + super(id, name); + } + + public void gebuehrenVerbuchen(Kunde kunde, double betrag) { + if (kunde == null) { + System.out.println("Kunde nicht gefunden."); + return; + } + + Consumer verbuchen = b -> { + if (b > kunde.getGebuehren()) { + System.out.println("Zahlung von " + b + "€ ist höher als die offenen Gebühren (" + kunde.getGebuehren() + "€)."); + } else { + kunde.gebuehrenErhoehen(-b); // Gebühren reduzieren + System.out.println("Admin " + name + " hat eine Zahlung von " + b + "€ für Kunde '" + kunde.getName() + "' verbucht."); + } + }; + verbuchen.accept(betrag); + } + + public void ausgelieheneMedienAnzeigen(Kunde kunde) { + if (kunde == null) { + System.out.println("Kunde nicht gefunden."); + return; + } + + System.out.println("Ausgeliehene Medien von " + kunde.getName() + ":"); + kunde.getAusgelieheneMedien().forEach(medien -> + System.out.println("- " + medien.getTitel() + " (Rückgabedatum: " + medien.getRueckgabedat() + ")") + ); + } + + @Override + public void rolleAnzeigen() { + System.out.println("Admin: " + name); + } } diff --git a/Biblio/src/Bibliothek/Bibliotheksverwaltung.java b/Biblio/src/Bibliothek/Bibliotheksverwaltung.java index ae7df60..ab8a79a 100644 --- a/Biblio/src/Bibliothek/Bibliotheksverwaltung.java +++ b/Biblio/src/Bibliothek/Bibliotheksverwaltung.java @@ -1,4 +1,67 @@ package Bibliothek; +import java.util.*; +import java.util.function.Predicate; + public class Bibliotheksverwaltung { + private Map medienBestand; + private Map kundenListe; + private Map adminListe; + + public Bibliotheksverwaltung() { + medienBestand = new HashMap<>(); + kundenListe = new HashMap<>(); + adminListe = new HashMap<>(); + } + + public void medienHinzufuegen(Medien medien) { + medienBestand.put(medien.getId(), medien); + System.out.println("Medium hinzugefügt: " + medien.getTitel()); + } + + public void alleMedienAnzeigen() { + System.out.println("Medienbestand:"); + medienBestand.values().forEach(m -> + System.out.println("- " + m.getDetails() + + (m.verfuegbar() ? " [Verfügbar]" : " [Ausgeliehen]")) + ); + } + + public void medienDurchsuchen(String suchbegriff) { + System.out.println("Suchergebnisse für '" + suchbegriff + "':"); + medienBestand.values().stream() + .filter(m -> m.getTitel().toLowerCase().contains(suchbegriff.toLowerCase())) + .forEach(m -> System.out.println("- " + m.getDetails())); + } + + public void medienFiltern(Predicate kriterium) { + System.out.println("Gefilterte Medien:"); + medienBestand.values().stream() + .filter(kriterium) + .forEach(m -> System.out.println("- " + m.getDetails())); + } + + public void medienAusleihen(String medienId, String kundenId) { + Optional.ofNullable(medienBestand.get(medienId)) + .ifPresentOrElse( + medien -> Optional.ofNullable(kundenListe.get(kundenId)) + .ifPresentOrElse( + kunde -> kunde.medienAusleihen(medien), + () -> System.out.println("Kunde nicht gefunden.") + ), + () -> System.out.println("Medium nicht gefunden.") + ); + } + + public void medienZurueckgeben(String medienId, String kundenId) { + Optional.ofNullable(medienBestand.get(medienId)) + .ifPresentOrElse( + medien -> Optional.ofNullable(kundenListe.get(kundenId)) + .ifPresentOrElse( + kunde -> kunde.medienZurueckgeben(medien), + () -> System.out.println("Kunde nicht gefunden.") + ), + () -> System.out.println("Medium nicht gefunden.") + ); + } } diff --git a/Biblio/src/Bibliothek/Brettspiel.java b/Biblio/src/Bibliothek/Brettspiel.java index 0181a75..55651a9 100644 --- a/Biblio/src/Bibliothek/Brettspiel.java +++ b/Biblio/src/Bibliothek/Brettspiel.java @@ -2,7 +2,7 @@ package Bibliothek; public class Brettspiel extends Medien { private int spieleranzahl; - private int spieldauer; // in Minuten + private int spieldauer; public Brettspiel(String id, String titel, int erscheinungsjahr, int spieleranzahl, int spieldauer) { super(id, titel, erscheinungsjahr); @@ -11,12 +11,17 @@ public class Brettspiel extends Medien { } @Override - public int getAusleihdauer() { return 3; } // 3 Wochen für Brettspiele + public int getAusleihdauer() { + return 3; + } + @Override - public int getMaxVerlaengerungen() { return 2; } // Brettspiele können 2-mal verlängert werden + public int getMaxVerlaengerungen() { + return 1; + } @Override public String getDetails() { - return "Brettspiel: " + titel + ", Spieleranzahl: " + spieleranzahl + ", Spieldauer: " + spieldauer + " Minuten"; + return "Brettspiel: " + titel + " (" + erscheinungsjahr + "), Spieleranzahl: " + spieleranzahl + ", Spieldauer: " + spieldauer + " Minuten"; } } diff --git a/Biblio/src/Bibliothek/Buch.java b/Biblio/src/Bibliothek/Buch.java index 0b0cba8..c75c93f 100644 --- a/Biblio/src/Bibliothek/Buch.java +++ b/Biblio/src/Bibliothek/Buch.java @@ -11,12 +11,17 @@ public class Buch extends Medien { } @Override - public int getAusleihdauer() { return 4; } // 4 Wochen + public int getAusleihdauer() { + return 4; + } + @Override - public int getMaxVerlaengerungen() { return 3; } + public int getMaxVerlaengerungen() { + return 3; + } @Override public String getDetails() { - return "Buch: " + titel + " von " + autor + " (" + erscheinungsjahr + "), Seiten: " + seitenanzahl; + return "Buch: " + titel + " von " + autor + " (" + erscheinungsjahr + "), " + seitenanzahl + " Seiten"; } } diff --git a/Biblio/src/Bibliothek/CD.java b/Biblio/src/Bibliothek/CD.java index 85563d0..5821935 100644 --- a/Biblio/src/Bibliothek/CD.java +++ b/Biblio/src/Bibliothek/CD.java @@ -2,21 +2,26 @@ package Bibliothek; public class CD extends Medien { private String kuenstler; - private int anzahlTitel; + private int tracks; - public CD(String id, String titel, int erscheinungsjahr, String kuenstler, int anzahlTitel) { + public CD(String id, String titel, int erscheinungsjahr, String kuenstler, int tracks) { super(id, titel, erscheinungsjahr); this.kuenstler = kuenstler; - this.anzahlTitel = anzahlTitel; + this.tracks = tracks; } @Override - public int getAusleihdauer() { return 2; } // 2 Wochen für CDs + public int getAusleihdauer() { + return 2; + } + @Override - public int getMaxVerlaengerungen() { return 2; } // CDs können maximal 2-mal verlängert werden + public int getMaxVerlaengerungen() { + return 2; + } @Override public String getDetails() { - return "CD: " + titel + " von " + kuenstler + " (" + erscheinungsjahr + "), Titelanzahl: " + anzahlTitel; + return "CD: " + titel + " von " + kuenstler + " (" + erscheinungsjahr + "), " + tracks + " Tracks"; } } diff --git a/Biblio/src/Bibliothek/DVD.java b/Biblio/src/Bibliothek/DVD.java index 00f6465..9c0f774 100644 --- a/Biblio/src/Bibliothek/DVD.java +++ b/Biblio/src/Bibliothek/DVD.java @@ -2,7 +2,7 @@ package Bibliothek; public class DVD extends Medien { private String regisseur; - private int spieldauer; // Spieldauer in Minuten + private int spieldauer; public DVD(String id, String titel, int erscheinungsjahr, String regisseur, int spieldauer) { super(id, titel, erscheinungsjahr); @@ -11,9 +11,14 @@ public class DVD extends Medien { } @Override - public int getAusleihdauer() { return 1; } // 1 Woche für DVDs + public int getAusleihdauer() { + return 1; + } + @Override - public int getMaxVerlaengerungen() { return 1; } // DVDs können nur einmal verlängert werden + public int getMaxVerlaengerungen() { + return 1; + } @Override public String getDetails() { diff --git a/Biblio/src/Bibliothek/Kunde.java b/Biblio/src/Bibliothek/Kunde.java new file mode 100644 index 0000000..f8e58f3 --- /dev/null +++ b/Biblio/src/Bibliothek/Kunde.java @@ -0,0 +1,61 @@ +package Bibliothek; + +import java.util.List; +import java.util.ArrayList; +import java.util.function.Consumer; + +public class Kunde extends User { + private boolean istStudent; // True, wenn Kunde ein Student ist + private double gebuehren; // Offene Gebühren + + public Kunde(String id, String name, boolean istStudent) { + super(id, name); + this.istStudent = istStudent; + this.gebuehren = 0.0; + } + + public boolean istStudent() { + return istStudent; + } + + public double getGebuehren() { + return gebuehren; + } + + public void gebuehrenErhoehen(double betrag) { + this.gebuehren += betrag; + } + + public void berechneGebuehren() { + // Gebühren berechnen basierend auf verspäteter Rückgabe + ausgelieheneMedien.forEach(medien -> { + if (medien.getRueckgabedat().isBefore(java.time.LocalDate.now())) { + int ueberfaelligeTage = java.time.Period.between( + medien.getRueckgabedat(), + java.time.LocalDate.now() + ).getDays(); + + double tagessatz = istStudent ? 0.5 : 1.0; // Studenten zahlen 50% weniger + gebuehren += ueberfaelligeTage <= 7 + ? ueberfaelligeTage * tagessatz + : (7 * tagessatz) + ((ueberfaelligeTage - 7) * 2); + } + }); + } + + public void medienVerlaengern(Medien medien, int aktuelleVerlaengerungen) { + Consumer verlaengerung = m -> { + if (ausgelieheneMedien.contains(m) && m.verlaengern(aktuelleVerlaengerungen)) { + System.out.println("Medium verlängert: " + m.getTitel()); + } else { + System.out.println("Verlängerung nicht möglich."); + } + }; + verlaengerung.accept(medien); + } + + @Override + public void rolleAnzeigen() { + System.out.println("Kunde: " + name + (istStudent ? " (Student)" : " (Erwachsener)")); + } +} diff --git a/Biblio/src/Bibliothek/Medien.java b/Biblio/src/Bibliothek/Medien.java index d47617b..8bb83ea 100644 --- a/Biblio/src/Bibliothek/Medien.java +++ b/Biblio/src/Bibliothek/Medien.java @@ -6,14 +6,13 @@ public abstract class Medien { protected String titel; protected String id; protected int erscheinungsjahr; - protected boolean verfuegbar; + protected boolean verfuegbar = true; protected LocalDate rueckgabedat; public Medien(String titel, String id, int erscheinungsjahr) { this.titel = titel; this.id = id; this.erscheinungsjahr = erscheinungsjahr; - this.verfuegbar = true; } public String getTitel() { return titel; @@ -27,6 +26,14 @@ public abstract class Medien { public void setId(String id) { this.id = id; } + + public LocalDate getRueckgabedat() { + return rueckgabedat; + } + + public boolean verfuegbar(){ + return verfuegbar; + } public int getErscheinungsjahr() { return erscheinungsjahr; } @@ -47,13 +54,22 @@ public abstract class Medien { } public boolean verlaengern(int aktuelleVerlaengerungen) { - if (aktuelleVerlaengerungen < getMaxVerlaengerungen()) { - rueckgabedat = rueckgabedat.plusWeeks(getAusleihdauer()); - return true; + if (verfuegbar) { + System.out.println("Medium '" + titel + "' ist verfügbar und kann nicht verlängert werden."); + return false; } - return false; + if (rueckgabedat == null) { + System.out.println("Medium '" + titel + "' hat kein Rückgabedatum. Verlängerung nicht möglich."); + return false; + } + if (aktuelleVerlaengerungen >= getMaxVerlaengerungen()) { + System.out.println("Medium '" + titel + "' kann nicht weiter verlängert werden. Maximale Verlängerungen erreicht."); + return false; + } + rueckgabedat = rueckgabedat.plusWeeks(getAusleihdauer()); + System.out.println("Medium '" + titel + "' wurde verlängert. Neues Rückgabedatum: " + rueckgabedat); + return true; } - public void zurueckgeben() { verfuegbar = true; rueckgabedat = null; diff --git a/Biblio/src/Bibliothek/User.java b/Biblio/src/Bibliothek/User.java index e0acb9c..075b4c4 100644 --- a/Biblio/src/Bibliothek/User.java +++ b/Biblio/src/Bibliothek/User.java @@ -1,4 +1,50 @@ package Bibliothek; -public class User { +import java.util.ArrayList; +import java.util.List; + +public abstract class User { + protected String id; + protected String name; + protected List ausgelieheneMedien; + + public User(String id, String name) { + this.id = id; + this.name = name; + this.ausgelieheneMedien = new ArrayList<>(); + } + + public String getId() { + return id; + } + + public String getName() { + return name; + } + + public List getAusgelieheneMedien() { + return ausgelieheneMedien; + } + + public void medienAusleihen(Medien medien) { + if (medien.verfuegbar()) { + medien.ausleihen(); + ausgelieheneMedien.add(medien); + System.out.println(name + " hat '" + medien.getTitel() + "' ausgeliehen."); + } else { + System.out.println("'" + medien.getTitel() + "' ist nicht verfügbar."); + } + } + + public void medienZurueckgeben(Medien medien) { + if (ausgelieheneMedien.contains(medien)) { + medien.zurueckgeben(); + ausgelieheneMedien.remove(medien); + System.out.println(name + " hat '" + medien.getTitel() + "' zurückgegeben."); + } else { + System.out.println("'" + medien.getTitel() + "' wurde nicht von " + name + " ausgeliehen."); + } + } + + public abstract void rolleAnzeigen(); } diff --git a/Biblio/src/Bibliothek/Videospiel.java b/Biblio/src/Bibliothek/Videospiel.java index 4337bb7..37de2b6 100644 --- a/Biblio/src/Bibliothek/Videospiel.java +++ b/Biblio/src/Bibliothek/Videospiel.java @@ -1,22 +1,27 @@ package Bibliothek; public class Videospiel extends Medien { - private String plattform; // z.B. PC, PlayStation, Xbox - private String genre; + private String plattform; + private String entwickler; - public Videospiel(String id, String titel, int erscheinungsjahr, String plattform, String genre) { + public Videospiel(String id, String titel, int erscheinungsjahr, String plattform, String entwickler) { super(id, titel, erscheinungsjahr); this.plattform = plattform; - this.genre = genre; + this.entwickler = entwickler; } @Override - public int getAusleihdauer() { return 2; } // 2 Wochen für Videospiele + public int getAusleihdauer() { + return 2; + } + @Override - public int getMaxVerlaengerungen() { return 1; } // Videospiele können nur einmal verlängert werden + public int getMaxVerlaengerungen() { + return 2; + } @Override public String getDetails() { - return "Videospiel: " + titel + " (" + plattform + ", Genre: " + genre + ", " + erscheinungsjahr + ")"; + return "Videospiel: " + titel + " (" + erscheinungsjahr + "), Plattform: " + plattform + ", Entwickler: " + entwickler; } }