Im nächsten Schritt werden die Datenstrukturen für die Videos geschaffen.
Der Videokatalog
Die Videos eines Automaten zeichnen sich durch einen Titel und die jeweilige Anzahl, sowie den Einkaufspreis für den Betreiber und den Verkaufspreis für den Kunden aus. Entsprechend bietet sich zu ihrer Datenhaltung ein CountingStock
an. Ein solcher Bestand referenziert auf die Einträge des ihm zugeordneten Katalogs und speichert deren verfügbare Anzahl. Die Katalogeinträge wiederum besitzen die Attribute Bezeichnung und Preis.
Dem entsprechend wird zunächst ein Catalog
benötigt, der die Videonamen und -preise enthält. Da es sich dabei um ein Interface handelt, bedarf es einer Klasse, die dieses Schnittstellenverhalten implementiert. Im Framework existiert bereits eine vordefinierte Klasse namens CatalogImpl
, die für die meisten Zwecke ausreichen dürfte. Der Konstruktor dieser Klasse verlangt einen String-Bezeichner, der den Katalog eindeutig von anderen unterscheidet. Es wird zunächst folgende Zeile der Klasse VideoShop
hinzugefügt:
public class VideoShop extends Shop { public static final String C_VIDEOS = "VideoCatalog"; . . . }
Diese Konstante soll der künftige Bezeichner für den Videokatalog sein. Der Katalog wird im Konstruktor von VideoShop
wie folgt instantiiert:
public class VideoShop extends Shop { . . . public VideoShop() { . . . addCatalog(new CatalogImpl(C_VIDEOS)); } }
Der Videokatalog ist durch die Aufnahme in die Katalogsammlung des Ladens von jeder Klasse der Anwendung aus erreichbar, jedoch ist der Aufruf, um an den Katalog zu gelangen unangenehm lang und wird vermutlich mehr als einmal verwendet. Zur Erleichterung wird eine statische Hilfsmethode in der Klasse VideoShop
geschaffen, die den Videokatalog zurückgibt.
public class VideoShop extends Shop { . . . public static CatalogImpl getVideoCatalog() { return (CatalogImpl) Shop.getTheShop().getCatalog(C_VIDEOS); } }
Nun existiert zwar ein Katalog, jedoch ohne Einträge. Damit im weiteren Verlauf des Programmierens und Testens einige Daten zur Verfügung stehen, wird die MainClass
um folgende Methode ergänzt:
public class MainClass { . . . public static void initializeVideos() { Catalog videoCatalog = VideoShop.getVideoCatalog(); CountingStock videoStock = VideoShop.getVideoStock(); for (int i = 0; i < 10; i++) { String s = "Video-" + i; CatalogItem video = new CatalogItemImpl(s, new QuoteValue(new IntegerValue(1500),new IntegerValue(3000))) { protected CatalogItemImpl getShallowClone() { return null; } }; videoCatalog.add(video, null); } } }
Die Methode bedarf ein wenig der Erklärung. Wie unschwer zu erkennen, werden in einer for-Schleife dem Videokatalog mehrere Katalogeinträge hinzugefügt. Es handelt sich bei CatalogItemImpl
um eine abstrakte Implementation des Interface CatalogItem
. Daher muss bei der direkten Instanzierung dieser Klasse die abstrakte Methode getShallowClone()
implementiert werden. Diese Methode soll normalerweise einen echten Klon der Instanz zurückliefern. In diesem Fall wird die Methode nicht benötigt und liefert daher lediglich null
zurück.
Dem Konstruktor von CatalogItemImpl
muss ein String und ein Value
übergeben werden. Value
ist ein Interface und es existieren zwei Implementationen dieser Schnittstelle im Framework. Zum Einen NumberValue
, welches einen numerischen Wert kapselt und QuoteValue
, das ein Paar von Werten repräsentiert, z.B. einen Ein- und Verkaufswert. In diesem Fall wird dem Konstruktor von CatalogItemImpl
der Titel des Videos und als zweiter Parameter eine Instanz von QuoteValue
übergeben, welche wiederum mit zwei IntegerValue
erzeugt wird. IntegerValue
ist lediglich eine Spezialisierung von NumberValue
, welche einen int-Wert kapselt, der hierbei der Wert in Cent ist.
Abschließend wird in der main-Methode der MainClass
die neue Methode zur Ausführung gebracht, damit die Änderungen wirksam werden.
public class MainClass { public static void main(String arqs[]) { . . . initializeVideos(); } . . . }
Der Videobestand
Nach der Fertigstellung des Katalogs kann im Folgenden der Bestand aufgebaut werden. Wie bereits im Abschnitt Der Videokatalog erwähnt, sollen die Videos des Automaten in einem CountingStock
gespeichert werden. Auch für dieses Interface existiert eine vordefinierte Klasse mit dem gewohnten Impl
am Ende des Namens. Ein jeder Bestand bezieht sich auf einen Katalog, so dass dieser konsequenterweise neben dem String-Bezeichner dem Konstruktor von CountingStockImpl
übergeben werden muss. Es wird analog zum Videokatalog in den Konstruktor von VideoShop
folgende Zeile eingefügt:
public class VideoShop extends Shop { . . . public VideoShop() { . . . addStock( new CountingStockImpl( CC_VIDEOS, (CatalogImpl) getCatalog(C_VIDEOS))); } . . . }
Am Anfang der Klasse muss außerdem die String-Konstante deklariert werden.
public static final String CC_VIDEOS = "VideoStock";
Auch beim Videobestand lohnt es sich eine Hilfsmethode zu schreiben, die selbigen zurückliefert.
public class VideoShop extends Shop { . . . public static CountingStockImpl getVideoStock() { return (CountingStockImpl) Shop.getTheShop().getStock(CC_VIDEOS); } }
Der neue Bestand ist wiederum leer. Durch das Hinzufügen einer Zeile in die Initialisierungsmethode der Videos in MainClass
können dem Videobestand die benötigten Testdaten zugefügt werden.
public static void initializeVideos() { Catalog videoCatalog = VideoShop.getVideoCatalog(); CountingStock videoStock = VideoShop.getVideoStock(); for (int i = 0; i < 10; i++) { String s = "Video-" + i; . . . videoStock.add(s, 5, null); } }
Der Aufruf add(String id, int count, DataBasket db)
bewirkt, dass von dem Katalogeintrag mit der Bezeichnung id
insgesamt count
-Stück in den Bestand aufgenommen werden. Der DataBasket
, der zum Schluss übergeben wird, hat etwas mit der Sichtbarkeit der vollführten Aktion zu tun. Was es mit dem Interface DataBasket
auf sich hat, wird in Abschnitt Transaktionen mittels einer Tabelle näher erläutert. Vorerst reicht es zu wissen, dass hier durch die Übergabe von null
das Hinzufügen unmittelbar wirksam wird.
Der Grundaufbau | Den Videobestand anzeigen |