Für die Implementation des Leih- oder Rückgabeprozesses fehlt eine wichtige Grundlage: die Verwaltung des Geldes. Diese soll im folgenden Kapitel geschaffen werden.
Die Währung
Das im Videoautomaten befindliche Geld kann nicht durch eine einzelne, numerische Variable repräsentiert werden. Es muss mit verschiedenen Münzen und Scheinen umgegangen werden und diese müssen auch separat dargestellt werden. Ansonsten hätte das Programm keine Kenntnis von den im Automat befindlichen Geldgrößen und wäre nicht einmal in der Lage Wechselgeld auszugeben.
Im Grunde genommen lassen sich Münzen oder Geldscheine bereits durch das Frameworkmodell der Kataloge und Bestände realisieren, indem im Katalog die möglichen Größen definiert werden und in einem zählenden Bestand die Anzahl der jeweiligen Größe vermerkt wird. Darüberhinaus existieren in SalesPoint bereits Ableitungen von CatalogImpl
und CountingStockImpl
, die auf Währungseinheiten ausgerichtet sind. Das hat den Vorteil, dass alle Münzen und Scheine der jeweiligen Währung bereits im Katalog enthalten sind. Außerdem bietet ein solcher Währungskatalog die Möglichkeit eine Geldsumme entsprechend formatiert auszugeben, was sich z.B. bei der Anzeige der Videopreise günstig auswirken wird.
Ein auf das europäische Zahlungsmittel ausgerichteter Währungskatalog ist die Klasse EUROCurrencyImpl
. Eine Instanz dieser Klasse wird als Grundlage für den Zahlungsverkehr am Automaten im Konstruktor von VideoShop
erzeugt.
public class VideoShop extends Shop { . . . public static final String C_CURRENCY = "CurrencyCatalog"; public VideoShop() { . . . addCatalog(new EUROCurrencyImpl(C_CURRENCY)); } . . . public static EUROCurrencyImpl getCurrency() { return (EUROCurrencyImpl) Shop.getTheShop().getCatalog(C_CURRENCY); } }
Ein Blick in das API der Klasse EUROCurrencyImpl
verrät die im Katalog vorhandenen Geldgrößen. Es ließe sich nun die Menge der möglichen Münzen und Scheine durch das Entfernen von entsprechenden Katalogeinträgen einschränken, vermutlich wird man beispielsweise auf 500,- € Scheine verzichten wollen. In diesem fiktiven Beispiel wird der Einfachheit halber auf den vollständigen Katalog zurückgegriffen.
Der Geldbeutel
Analog zum Währungskatalog gibt es auch eine auf Zahlungsmittel ausgerichtete Implementation eines Bestandes, die Klasse MoneyBagImpl
. Es handelt sich um eine Spezialisierung von CountingStockImpl
, die das Interface MoneyBag
implementiert. MoneyBag
ist ein sogenanntes Markerinterface, d.h. es definiert keinerlei Konstanten oder Methoden. Es dient lediglich der Markierung, dass dieser Bestand für Währungseinheiten bestimmt ist. Somit lässt sich ein solcher Geldbeutel genauso wie ein einfacher CountingStock
behandeln.
Es wird für die Verwaltung des im Automaten befindlichen Geldes ein MoneyBagImpl
im Konstruktor von VideoShop
angelegt. Der zuvor angelegte Währungskatalog wird als Parameter übergeben. Außerdem wird wie gehabt eine statische Rückgabemethode für den neu erzeugten Bestand implementiert.
public class VideoShop extends Shop { . . . public static final String MB_MONEY = "Money"; public VideoShop() { . . . addStock( new MoneyBagImpl( MB_MONEY, (EUROCurrencyImpl) getCatalog(C_CURRENCY))); } . . . public static MoneyBagImpl getMoneyBag() { return (MoneyBagImpl) Shop.getTheShop().getStock(MB_MONEY); } }
Zur Schaffung eines Grundkapitals wird, wie zuvor beim Videobestand und der Nutzerverwaltung, eine Methode der Klasse MainClass
hinzugefügt, in der dem Geldbeutel des Automaten ein paar Einträge zugefügt werden. Die neudefinierte Methode wird in main(String[] arg)
aufgerufen.
public class MainClass { public static void main(String arqs[]) { . . . initializeMoney(); } . . . public static void initializeMoney() { MoneyBagImpl mbi = (MoneyBagImpl) Shop.getTheShop().getStock(VideoShop.MB_MONEY); mbi.add(EUROCurrencyImpl.CENT_STCK_10, 100, null); mbi.add(EUROCurrencyImpl.CENT_STCK_20, 100, null); mbi.add(EUROCurrencyImpl.CENT_STCK_50, 100, null); mbi.add(EUROCurrencyImpl.EURO_STCK_1, 100, null); mbi.add(EUROCurrencyImpl.EURO_STCK_2, 50, null); mbi.add(EUROCurrencyImpl.EURO_SCHEIN_10, 100, null); mbi.add(EUROCurrencyImpl.EURO_SCHEIN_20, 10, null); } }
Die Namen der Katalogeinträge in EUROCurrencyImpl
sind, wie im Beispiel zu sehen ist, als Konstanten in derselben Klasse abrufbar.
Formatierung der Preise
Auf der Grundlage des Währungskatalogs ist es nun mehr möglich die Anzeige des Videobestands zu verbessern. Zur Erinnerung: Die Preise der Videos werden in Cent und ohne Währungssymbol angezeigt.
Es bedarf lediglich eines kleinen Eingriffs in der Klasse TEDVideoStock
um den Schönheitsfehler zu korrigieren. Durch Neudefinition der Methode getCellRenderer(int nIdx)
lässt sich konkret auf die Formatierung der angezeigten Daten Einfluss nehmen. Hier wird für die Formatierung der Videopreise eine Instanz der Klasse CurrencyRenderer
mittels des Währungskatalogs erzeugt. Eine solche nimmt ein NumberValue
als Eingabe und liefert auf Basis des jeweiligen Währungskatalogs die korrekt formatierte Darstellung des Wertes.
public TableCellRenderer getCellRenderer(int nIdx) { switch (nIdx) { case 1 : return renderer; } return super.getCellRenderer(nIdx); }
Nach erfolgter Neuübersetzung und Ausführung der Anwendung kann die Formatierung der Preise betrachtet werden.
Die Anmeldung | Die Zeit |