Antwort mit KI erzeugt
a) UML Klassendiagramm
Hier ist das UML-Klassendiagramm, welches die Beziehung der Klasse
Warenkorb
, der abstrakten Klasse
AbrechnungsStrategie
und der drei konkreten Strategien (
RegulaerStrategie
,
RabattStrategie
,
AktionStrategie
) zeigt. Die relevantesten Felder und Methoden sind ebenfalls enthalten.
plaintext
+------------------------------------------------------+
| Warenkorb |
|------------------------------------------------------|
| - strategy: AbrechnungsStrategie |
|------------------------------------------------------|
| + Warenkorb(s: AbrechnungsStrategie) |
| + berechneGesamtkosten(einzelkosten: List<Double>): |
| double |
+------------------------------------------------------+
|
|
v
+------------------------------------------------------+
| AbrechnungsStrategie |
|------------------------------------------------------|
| + berechne(einzelkosten: List<Double>): double |
+------------------------------------------------------+
/ | \
/ | \
+----------------+ +------------------+ +-------------------+
| RegulaerStrategie | | RabattStrategie | | AktionStrategie |
|----------------- | | ----------------| | ------------------|
|+ berechne(einzel-| |+ berechne(einzel-| |+ berechne(einzel- |
| kosten: List< | | kosten: List< | | kosten: List< |
| Double>): double | | Double>): double | | Double>): double |
+------------------+ +------------------+ +-------------------+
b) Java-Code für die Strategien
Hier ist der Java-Code zur Umsetzung der drei genannten Strategien und der abstrakten Klasse
AbrechnungsStrategie
:
java
import java.util.List;
import java.util.Collections;
interface AbrechnungsStrategie {
double berechne(List<Double> einzelkosten);
}
class RegulaerStrategie implements AbrechnungsStrategie {
@Override
public double berechne(List<Double> einzelkosten) {
return einzelkosten.stream().mapToDouble(Double::doubleValue).sum();
}
}
class RabattStrategie implements AbrechnungsStrategie {
@Override
public double berechne(List<Double> einzelkosten) {
double summe = einzelkosten.stream().mapToDouble(Double::doubleValue).sum();
return summe * 0.8; // 20% Rabatt
}
}
class AktionStrategie implements AbrechnungsStrategie {
@Override
public double berechne(List<Double> einzelkosten) {
if (einzelkosten.size() < 3) {
return einzelkosten.stream().mapToDouble(Double::doubleValue).sum();
} else {
double minimalerPreis = Collections.min(einzelkosten);
double summe = einzelkosten.stream().mapToDouble(Double::doubleValue).sum();
return summe - minimalerPreis; // das günstigste Element ist umsonst
}
}
}
class Warenkorb {
private final AbrechnungsStrategie strategy;
public Warenkorb(AbrechnungsStrategie s) {
this.strategy = s;
}
public double berechneGesamtkosten(List<Double> einzelkosten) {
return this.strategy.berechne(einzelkosten);
}
public static void main(String[] args) {
List<Double> einzelkosten = List.of(10.0, 20.0, 30.0);
Warenkorb warenkorb = new Warenkorb(new RegulaerStrategie());
System.out.println("Regulär: " + warenkorb.berechneGesamtkosten(einzelkosten));
warenkorb = new Warenkorb(new RabattStrategie());
System.out.println("Rabatt: " + warenkorb.berechneGesamtkosten(einzelkosten));
warenkorb = new Warenkorb(new AktionStrategie());
System.out.println("Aktion: " + warenkorb.berechneGesamtkosten(einzelkosten));
}
}
Erläuterungen:
-
AbrechnungsStrategie
ist das Interface, welches die Methode
berechne
deklariert.
-
RegulaerStrategie
berechnet die Gesamtkosten als einfache Summe der Einzelkosten.
-
RabattStrategie
berechnet die Gesamtkosten und zieht 20% Rabatt ab.
-
AktionStrategie
berechnet die Gesamtkosten, lässt aber das günstigste Element kostenlos, falls es mindestens drei Elemente gibt.
-
Warenkorb
ist die Klasse, die das Strategy-Pattern nutzt, um die Gesamtkosten basierend auf der ausgewählten Strategie zu berechnen.
Die bereitgestellten Klassen sind kompatibel zu dem in Listing 1 gezeigten Code der Klasse
Warenkorb
.