Verbesserung der Kohäsion und der Funktionalität durch Lambdas

development
Leon Löhle 2024-11-15 16:21:42 +01:00
parent 17a7d60487
commit 54bc0bf9f8
10 changed files with 283 additions and 32 deletions

View File

@ -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<Double> 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);
}
}

View File

@ -1,4 +1,67 @@
package Bibliothek;
import java.util.*;
import java.util.function.Predicate;
public class Bibliotheksverwaltung {
private Map<String, Medien> medienBestand;
private Map<String, Kunde> kundenListe;
private Map<String, Admin> 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<Medien> 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.")
);
}
}

View File

@ -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";
}
}

View File

@ -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";
}
}

View File

@ -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";
}
}

View File

@ -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() {

View File

@ -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<Medien> 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)"));
}
}

View File

@ -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;

View File

@ -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<Medien> 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<Medien> 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();
}

View File

@ -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;
}
}