Nun wird das eigentliche Verleihen und Zurückgeben der Videos vorbereitet. Es ist notwendig, daß die Kunden eindeutig identifiziert werden können. Dies geschieht durch das Anmelden am Automaten mit einer Kundennummer. In dieser Anwendung wird das Identifizieren der Kunden vereinfacht. Jede (positive) natürliche Zahl ist als Kundennummer gültig. Außerdem wird angenommen, daß jeder Kunde, der den Automaten bedient, rechtmäßiger Kunde des "HOMECINEMA" ist - es findet keine weitere Überprüfung statt.

Identifikation

Es wird die Klasse Customer benötigt. Eine Instanz dieser Klasse repräsentiert einen angemeldeten Kunden. Zuerst wird wieder das Grundgerüst der Klasse implementiert. Die Variable customerID enthält dabei die jeweilige Kundennummer:

Customer


  public class Customer extends User
  {
    private String customerID;

    public Customer(String customerID)
    {
      super(customerID);
      this.customerID = customerID;
    }
  }
        

Um die Klasse User nutzen zu können muß das Paket users importiert werden:


  import users.*;
        

Da die Variable customerID als private deklariert wurde, benötigt man eine Methode, die den Wert dieser Variable zurückliefert:


  public String getCustomerID()
  {
    return customerID;
  }
        

Jeder Kunde erhält ein Benutzerkonto, in dem die ausgeliehenen Videos abgespeichert werden. Zurückgegebene bzw. gekaufte Videos werden aus dem Benutzerkonto entfernt. Durch einen StoringStock, der Attribut von Customer ist, erfolgt die Realisierung. Zuerst wird die Variable customerStoringStock definiert:

StoringStock


  private StoringStock customerStoringStock; 
        

Im Konstruktor wird der StoringStock erzeugt, der auf dem "Video-Catalog" basiert, und in die globale Stockliste aufgenommen.


  customerStoringStock =
    new StoringStockImpl(
      customerID,
      (CatalogImpl)Shop.getTheShop().getCatalog("Video-Catalog"));
  Shop.getTheShop().addStock(customerStoringStock);
        

Für die Verwendung von StoringStock, StoringStockImpl und Shop werden folgende import-Anweisungen benötigt:


  import sale.*;
  import data.*; 
  import data.ooimpl.*;
        

Die Elemente des customerStoringStock sind Instanzen der Klasse CassetteStoringStockItem, die nun implementiert wird. Neben dem Schlüsselwert und dem Namen des entliehenen Videos wird das Datum der Ausleihe vermerkt.

StoringStockItem


  import sale.*;
  import data.ooimpl.*;
  import data.*;

  public class CassetteStoringStockItem extends StockItemImpl
  {
    private Object date;

    public CassetteStoringStockItem(String name, Object date)
    {
      super(name);
      this.date = date;
    }
  }  
        

Zum Schluß wird die Methode getDate geschrieben, die das Ausleihdatum des speziellen Videos liefert.


  public Object getDate()
  {
    return date;
  }
        

Es sind alle Voraussetzung erfüllt, um Videos über Methoden zum customerStoringStock hinzufügen und entfernen zu können. Die Klasse Customer wird wie folgt ergänzt:


  public void addVideoCassette(CassetteStoringStockItem cassette)
  {
    customerStoringStock.add(cassette, null);
  }

  public void removeVideoCassette(CassetteStoringStockItem cassette)
  {
    try {
      customerStoringStock.remove(cassette, null); 
    }
    catch (VetoException ve) {
    }
  }
        

Die Methoden add und remove erwarten als zweiten Parameter wieder einen DataBasket. Da ein DataBasket hier keine Rolle spielt, wird null übergeben. Es ist zu beachten, daß einige Kataloge in der Lage sind, das Verändern bzw. Löschen eines CatalogItems zu blockieren, indem sie eine VetoException werfen, z.B. wenn das CatalogItem gerade anderweitig benutzt wird. Die Exception ist im Paket data.events implementiert, das in die import-Anweisungen aufgenommen werden muß:

VetoException


  import data.events.*;
        

Eine Übersicht aller Videos, die ein Kunde ausgeliehen hat, wird durch die Methode getStoringStock geliefert.


  public StoringStock getStoringStock()
  {
    return customerStoringStock;
  }
        

Die Verwaltung der Kunden erfolgt in der Klasse VideoMachine. In einem HashSet werden alle registrierten Kunden abgespeichert. Folgende Variablendeklaration wird in die Klasse VideoMachine eingefügt:

Kundenverwaltung


  private static Set customerSet = new HashSet();
        

Desweiteren werden Methoden benötigt, mit denen Kunden in die Liste aufgenommen und entfernt werden können. Die Klasse VideoMachine wird erweitert:


  public static void addCustomer(Customer customer)
  {
    customerSet.add(customer);
  }

  public static void removeCustomer(Customer customer)
  {
    customerSet.remove(customer);
  }
        

Eine weitere Methode wird gebraucht, um eine Liste von allen registrierten Kunden abzurufen:


  public static Set getAllCustomer()
  {
    return customerSet.isEmpty() ? null : customerSet;
  }
        

Um die Kundenliste nach einem Kunden mit einer bestimmten ID zu durchsuchen, wird die Klasse VideoMachine noch einmal ergänzt:


  public static Customer getCustomerByID(String customerID)
  {
    Iterator i = customerSet.iterator();
    while (i.hasNext()) {
      Customer customer = (Customer)i.next();
      if (customer.getCustomerID().equals(customerID))
	return customer;
    }
    return null;
  }
        

Hier der Quelltext der in diesem Kapitel geänderten Klassen:

Das Angebot anzeigen Der Ausleihvorgang

last modified on 24.09.2001
by kk15 and ch17