Videoautomat - Das Geld

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.

    CurrencyRenderer renderer = new CurrencyRenderer(VideoShop.getCurrency());
		.
		.
		.
    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.


previous Die AnmeldungDie Zeit next



by Thomas Ryssel