Tisch Restaurant Gaeste Setzer
|
+--RestaurantTisch
Hier wurde folgende "Verteilung der Aufgaben" gewählt:
public class Tisch
{ protected int SitzPlätze;
//Konstruktor
public Tisch(int SitzPlätze)
{
this.SitzPlätze = SitzPlätze;
}
}
RestaurantTisch.java zum Mitnehmen
public class RestaurantTisch extends Tisch
{
private int TischNummer;
private int frei;
private Gaeste TischGaeste[] = new Gaeste[SitzPlätze];
//Konstruktor
public RestaurantTisch(int SitzPlätze, int TischNummer)
{
super(SitzPlätze);
this.TischNummer = TischNummer;
frei = SitzPlätze;
}
//gib Tischbelegung aus
public void show()
{
System.out.print("Tisch " + TischNummer);
System.out.print(" (" + SitzPlätze + " Plätze / ");
System.out.println(frei + " freie Plätze)");
for (int g = 0; g < TischGaeste.length; g++)
{
if (TischGaeste[g] != null)
{
System.out.print("\t");
TischGaeste[g].show();
}
}
}
//wieviele Plätze sind noch frei?
public int frei()
{
return frei;
}
//setze Gäste an den Tisch und kennzeichne Plätze als belegt
public void plaziere(Gaeste g)
{
if (g.Anzahl() <= frei)
{ // sie passen
for (int i = 0; i < TischGaeste.length; i++)
{ // suche freien Platz im Array TischGaeste
if (TischGaeste[i] == null)
{ // wir nehmen die Gäste auf
TischGaeste[i]=g;
frei -= g.Anzahl();
return;
}
}
}
// sie passen nicht
System.out.println("Sorry");
g.show();
System.out.println("passen nicht an Tisch " + TischNummer);
}
//mache Belegung durch die Gruppe rückgängig
public boolean freimachen(Gaeste g)
{ // prüfen, ob die Gäste an diesem Tisch sitzen
for (int i = 0; i < TischGaeste.length; i++)
{
if (TischGaeste[i] == g)
{ // wir machen die Plätze frei
TischGaeste[i]=null;
frei += g.Anzahl();
return true;
}
}
return false;
}
//Tisch leer?
public boolean leer()
{ // sitzt keiner am Tisch
return frei == SitzPlätze;
}
}
public class Restaurant
{
private String name;
private RestaurantTisch Tische[];
private int toptisch = 0;
//Konstruktor
public Restaurant(String name, int MaxTisch)
{
this.name = name;
Tische = new RestaurantTisch[MaxTisch];
}
//stelle Tisch auf
public void add(RestaurantTisch t)
{
Tische[toptisch++] = t;
}
//aktuelle Belegung der Tische
public void show()
{
System.out.println();
for (int t=0; t < toptisch; t++)
{
Tische[t].show();
}
}
//Plazierung für die Gästegruppe finden
public void kommen(Gaeste g)
{
final int KEINER = -1;
int tisch = KEINER; // die Gäste sollen an Tische[tisch] sitzen
// wir waehlen den kleinsten passenden leeren Tisch
for (int t=0; t < toptisch; t++)
{
if (Tische[t].leer())
{ // reichen die Plätze?
if (Tische[t].frei() >= g.Anzahl())
{ // schon vorher einen gefunden?
if (tisch != KEINER)
{ // nimm den kleineren der beiden
if (Tische[t].frei() < Tische[tisch].frei())
{
tisch = t;
}
}
else tisch = t;
}
}
}
// wenn kein passender frei war, versuchen wir die Gäste an einem
// schon teilweise besetzten Tisch zu plazieren
if (tisch == KEINER)
for (int t=0; t < toptisch; t++)
{ // reichen die Plätze
if (Tische[t].frei() >= g.Anzahl())
{ // schon vorher einen gefunden?
if (tisch != KEINER)
{ // nimm den kleineren der beiden
if (Tische[t].frei() < Tische[tisch].frei())
{
tisch = t;
}
}
else tisch = t;
}
}
if (tisch == KEINER)
{ // Tschuldigung
System.out.println("Sorry ");
System.out.print("\t");
g.show();
System.out.println("finden im Moment keinen Platz\n");
}
else
{
Tische[tisch].plaziere(g);
}
}
//Tischbelegung rückgängig machen
public void gehen(Gaeste g)
{
for (int t=0; t < toptisch; t++)
{
if (Tische[t].freimachen(g))
return;
}
System.out.println("Sorry ");
System.out.print("\t");
g.show();
System.out.println("können nicht gehen, da sie gar nicht da sind\n");
}
}
public class Gaeste
{
private String Name;
private int Anzahl;
//Konstruktor
public Gaeste(String Name, int Anzahl)
{
this.Name = Name;
this.Anzahl = Anzahl;
}
//Gib alle Infos aus
public void show()
{
System.out.println(Name + ", " + Anzahl + " Personen");
}
//gib Personenzahl aus
public int Anzahl()
{
return Anzahl;
}
}
public class Setzer
{ private Restaurant r;
public Setzer(Restaurant r)
{
this.r = r;
}
//versuche die Gäste an einem geeigntem Tisch zu plazieren
public void kommen(Gaeste g)
{
r.kommen(g);
}
//mache die getroffene Belegung wieder rückgängig
public void gehen(Gaeste g)
{
r.gehen(g);
}
//gibt aktuelle Belegung des Restaurants aus
public void zeigeBelegung()
{
r.show();
}
}
ANMERKUNG
Die Implementierung des Plazierungsverfahrens liegt bei unserem Lösungsvorschlag in der Klasse Restaurant, was programmiertechnisch von Vorteil ist (direkter Zugriff auf das Array von Tischen). Die Klasse Setzer übernimmt hier lediglich die oberste Steuerungsebene durch den Aufruf der passenden Methoden aus Restaurant.
Diese Lösung ist als eine mögliche Lösung zu sehen und nicht zwingend. Eine andere Lösung ist es beispielsweise, das gesamte Plazierungsverfahren als Aufgabe der Klasse Setzer anzusehen und somit auch dort zu implementieren.
Wir sprechen daher bewußt von Lösungsvorschlägen und nicht von Musterlösungen.