Implementierung des Interfaces
Die Klasse Rechnungsbetrag

-
wird einmalig manuell erstellt
-
implementiert alle Methoden des generierten Interfaces
-
stellt eine Methode bereit, mit der das Regelmodul ausgeführt werden kann
-
stellt ggf. weitere Hilfsmethoden bereit, in unserem Beispiel eine Konvertierung von double nach BigDecimal
Gängige Entwicklungs-Werkzeuge, wie z.B. IntelliJ, Eclipse oder Visual Studio Code, können "auf Knopfdruck" aus einem Interface eine Implementierung generieren, sodass im Wesentlichen nur noch die Methoden inhaltlich ausprogrammiert werden müssen, in diesem Beispiel sind das alle Methoden mit der Annotation @Override.
Die Implementierung des Interfaces:
package lfet.demo;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Rechnungsbetrag implements Rechnungsbetrag_iFace {
private final Rechnungsbetrag_rulesEngine rulesEngine = new Rechnungsbetrag_rulesEngine();
private Rechnungsbetrag_model model;
public void berechneRechnungsbetrag(Rechnungsbetrag_model model) {
this.model = model;
this.model.setRechnungRabatt(BigDecimal.ZERO);
this.model.setRechnungPorto(BigDecimal.ZERO);
this.model.setRechnungBetrag(BigDecimal.ZERO);
rulesEngine.execute(this);
}
/**
* @param d any double value,
* NEGATIVE_INFINITY will be replaced Double.MAX_VALUE * -1.0,
* POSITIVE_INFINITY will be replaced Double.MAX_VALUE
* @return the value as BigDecimal, scale 2, RoundingMode.HALF_UP
*/
public BigDecimal bigDecimal(double d) {
return new BigDecimal(Double.toString(
d < Double.MAX_VALUE * -1.0 ? Double.MAX_VALUE * -1.0
: Math.min(d, Double.MAX_VALUE)))
.setScale(2, RoundingMode.HALF_EVEN);
}
/**
* <b>B01: Bestellwert</b><br>
* <br>
* <b>B01/01: < 20,00 - gering</b>
*/
@Override
public boolean isBestellwert_Kleiner2000() {
return model.getBestellwert().compareTo(bigDecimal(20.00)) < 0;
}
/**
* <b>B01: Bestellwert</b><br>
* <br>
* <b>B01/02: 20,00 - 75,00 - normal</b>
*/
@Override
public boolean isBestellwert_20007500() {
return model.getBestellwert().compareTo(bigDecimal(20.00)) >= 0 &&
model.getBestellwert().compareTo(bigDecimal(75.00)) <= 0;
}
/**
* <b>B02: Rabatt</b><br>
* <br>
* <b>B02/01: >0 - Rabatt wurde erfasst</b>
*/
public boolean isRabatt_Groesser0() {
return model.getRabatt().compareTo(BigDecimal.ZERO) > 0;
}
/**
* <b>B03: Rabattvariante</b><br>
* <br>
* <b>B03/01: % - prozentualer Nachlass auf den Bestellwert</b>
*/
@Override
public boolean isRabattvariante_ProzentualerNachlassAufDenBestellwert() {
return model.isRabattProzent();
}
/**
* <b>B04: Rabatt < Bestellwert</b><br>
* <br>
* <b>B04/01: J - Ja</b>
*/
@Override
public boolean isRabattKleinerBestellwert() {
return model.getRabatt().compareTo(model.getBestellwert()) < 0;
}
/**
* <b>A01: Rabatt berücksichtigen</b>
*/
@Override
public void doRabattBeruecksichtigen() {
model.setRechnungRabatt(model.isRabattProzent()
? model.getBestellwert()
.multiply(model.getRabatt())
.multiply(bigDecimal(0.01))
.setScale(2, RoundingMode.HALF_UP)
: model.getRabatt());
}
/**
* <b>A02: Porto berechnen</b>
*/
@Override
public void doPortoBerechnen() {
model.setRechnungPorto(model.getPorto());
}
/**
* <b>A03: Rechnungsbetrag</b><br>
* <br>
* <b>A03/01: akt. - Rechnungsbetrag muss aktualisiert werden</b>
*/
@Override
public void doRechnungsbetrag_Akt() {
model.setRechnungBetrag(
model.getBestellwert()
.subtract(model.getRechnungRabatt())
.add(model.getRechnungPorto())
);
}
/**
* <b>A03: Rechnungsbetrag</b><br>
* <br>
* <b>A03/02: übern. - Bestellwert kann als Rechnungsbetrag übernommen werden</b>
*/
@Override
public void doRechnungsbetrag_Uebern() {
model.setRechnungBetrag(model.getBestellwert());
}
/**
* @param dtName - Name der Entscheidungstabelle
* @param version - Zeitstempel der Generierung
* @param rules - Anzahl Regeln in der Entscheidungstabelle
* @param rule - Regel der Entscheidungstabelle, die jetzt ausgeführt wird
*/
@Override
public void doTrace(String dtName, String version, int rules, int rule) {
System.out.printf("%s, %s, %d, %d, %s\n",
dtName, version, rules, rule, model);
}
}