Pomoc dla laika

0

Zacząłem niedawno uczyć się javy i wpadło mi w dłonie takie oto zadanie i nie mam bladego pojęcia od czego zacząć za wszelaką pomoc serdecznie dziękuje.

Oto treść:

Napisać aplikację symulujacą proces rezerwacji pokoi w pewnej sieci hoteli.
Sieć hoteli oferuje różne rodzaje pokoi, każdy pokój ma swoją nazwę (jedynka, dwójka, rodzina, ...) oraz typ (budżetowy, standardowy, premium, ...). Ceny pokoi (za noc) znajdują się w cenniku.
Klienci po rejestracji otrzymują identyfikatory oraz deklarują kwotę pieniędzy, którą chce wydać na rezerwacje. Klienci wybierają pokoje i umieszczają je na swojej tzw. liście życzeń. Następnie (być może po jakimś czasie) w celu finalizacji rezerwacji przepakowują ją do koszyka i zapłacą za jego zawartość. Klienci mogą płacić kartą lub przelewem bankowym.

Aplikacja powinna być napisana tak, aby następujacy, przykładowy program

public class BookingTest {
  
	// cena pokoi (o podanym typie) z koszyka 
  static int cena(Koszyk k, String typ) {
	  /*<- tu trzeba wpisać ciało metody */ ( TO JEST NA ZIELONO ORGINALNIE )
  }

  public static void main(String[] args) {
   
		// cennik
	Cennik cennik = Cennik.pobierzCennik();
 
		// dodawanie nowych cen do cennika
    	cennik.dodaj("jedynka", "standard", 100, 80, 4);	// pokój jednoosobowy typu standardowego kosztuje 100 zł/noc jeśli klient zarezerwuje mniej niż 4 noce, 
    								// w innym przypadku kosztuje 80 zł/noc
 
    	cennik.dodaj("dwojka", "budzet", 140);			// pokój dwuosobowy typu budżetowego kosztuje 140 zł/noc niezależnie od liczby nocy
 
    	cennik.dodaj("trojka", "standard", 300);		// pokój trzyosobowy typu standardowego kosztuje 300 zł/noc niezależnie od liczby nocy

	cennik.dodaj("rodzina", "premium", 500);		// pokój rodzinny typu premium kosztuje 500 zł/noc niezależnie od liczby nocy
 
   		// Klient ocean deklaruje kwotę 2200 zł na rezerwacje
    	Klient ocean = new Klient("ocean", 2200);

    		// Klient ocean dodaje do listy życzeń różne rodzaje pokoi: 
		// 4 noce w pokoju jednoosobowym typu standardowego, 5 nocy w pokoju trzyosobowym typu standardowego, 
		// 3 noce w pokoju dwuosobowym typu premium, 3 noce w pokoju dwuosobowym budżetowym
    	ocean.dodaj(new Jedynka("standard", 4));
    	ocean.dodaj(new Trojka("standard", 5));
    	ocean.dodaj(new Dwojka("premium", 3));
    	ocean.dodaj(new Dwojka("budzet", 2));
		
		// Lista życzeń klienta ocean   	
	ListaZyczen listaOceanu = ocean.pobierzListeZyczen();
 
    	System.out.println("Lista życzeń klienta " + listaOceanu);

		// Przed płaceniem, klient przepakuje pokoje z listy życzeń do koszyka.
		// Możliwe, że na liście życzeń są pokoje niemające ceny w cenniku,
    		// w takim przypadku zostałyby usunięte z koszyka (ale nie z listy życzeń)     	
	Koszyk koszykOceanu = new Koszyk(ocean);
    	ocean.przepakuj(koszykOceanu);

    		// Co jest na liście życzeń klienta ocean
    	System.out.println("Po przepakowaniu, lista życzeń klienta " + ocean.pobierzListeZyczen());

		// Co jest w koszyku klienta ocean
	System.out.println("Po przepakowaniu, koszyk klienta " + koszykOceanu); 

		// Ile wynosi cena wszystkich pokoi typu standardowego w koszyku klienta ocean
    	System.out.println("Pokoje standardowe w koszyku klienta ocean kosztowały:  "
        	+ cena(koszykOceanu, "standard"));

    		// Klient zapłaci...
    	ocean.zaplac(false);	// false = płaci kartą płatniczą, bez prowizji

    		// Ile klientowi ocean zostało pieniędzy?
    	System.out.println("Po zapłaceniu, klientowi ocean zostało: " + ocean.pobierzPortfel() + " zł");
	
    		// Mogło klientowi zabraknąć srodków, wtedy pokoje są odkładane,
		// w innym przypadku koszyk jest pusty po zapłaceniu 
    	System.out.println("Po zapłaceniu, koszyk klienta " + ocean.pobierzKoszyk());
	System.out.println("Po zapłaceniu, koszyk klienta " + koszykOceanu); 	
 
		// Teraz przychodzi klient morze,
    		// deklaruje 780 zł na rezerwacje
    	Klient morze = new Klient("morze", 780);

    		// Zarezerwował za dużo jak na tę kwotę
	morze.dodaj(new Jedynka("standard", 3));
    	morze.dodaj(new Dwojka("budzet", 4));
    
    		// Co klient morze ma na swojej liście życzeń
    	System.out.println("Lista życzeń klienta " + morze.pobierzListeZyczen());
		
		// Przepakowanie z listy życzeń do koszyka,
		// może się okazać, że na liście życzeń są pokoje niemające ceny w cenniku,
    		// w takim razie zostałyby usunięte z koszyka (ale nie z listy życzeń)     		
	Koszyk koszykMorza = new Koszyk(morze);
    	morze.przepakuj(koszykMorza);
	
    		// Co jest na liście życzeń morze
    	System.out.println("Po przepakowaniu, lista życzeń klienta " + morze.pobierzListeZyczen());

	    	// A co jest w koszyku klienta morze
    	System.out.println("Po przepakowaniu, koszyk klienta " + morze.pobierzKoszyk());
    	
		// klient morze płaci
    	morze.zaplac(true);	// true = płaci przelewem, prowizja 5 PLN
		
		// Ile klientowi morze zostało pieniędzy? 
	System.out.println("Po zapłaceniu, klientowi morze zostało: " + morze.pobierzPortfel() + " zł");
		
		// Co zostało w koszyku klienta morze (za mało pieniędzy miał)
 	System.out.println("Po zapłaceniu, koszyk klienta " + koszykMorza); 	

   }
}

wyprowadził na konsolę podobne do poniższych wyniki:

Lista życzeń klienta ocean:
jedynka, typ: standard, ile: 4 nocy, cena 80
trojka, typ: standard, ile: 5 nocy, cena 300
dwojka, typ: premium, ile: 3 noce, cena -1.0
dwojka, typ: budzet, ile: 2 noce, cena 140
Po przepakowaniu, lista życzeń klienta ocean:
dwojka, typ: premium, ile: 3 noce, cena -1.0
Po przepakowaniu, koszyk klienta ocean:
jedynka, typ: standard, ile: 4 noce, cena 80
trojka, typ: standard, ile: 5 nocy, cena 300
dwojka, typ: budzet, ile: 2 noce, cena 140
Pokoje standardowe w koszyku klienta ocean kosztowały: 1820
Po zapłaceniu, klientowi ocean zostało: 100 zł
Po zapłaceniu, koszyk klienta ocean: -- pusto
Po zapłaceniu, koszyk klienta ocean: -- pusto
Lista życzeń klienta morze:
jedynka, typ: standard, ile: 3 noce, cena 100
dwojka, typ: budzet, ile: 4 noce, cena 140
Po przepakowaniu, lista życzeń klienta morze: -- pusto
Po przepakowaniu, koszyk klienta morze:
jedynka, typ: standard, ile: 3 noce, cena 100
dwojka, typ: budzet, ile: 4 noce, cena 140
Po zapłaceniu, klientowi morze zostało: 55 zł
Po zapłaceniu, koszyk klienta morze:
dwojka, typ: budzet, ile: 1 noc, cena 140

Kod programu testującego wolno zmienić wyłącznie w miejscu zaznaczonym na zielono.

Dodawanie nowych rodzajów pokoi musi być zrealizowane w sposób bardzo prosty, w takim przypadku modyfikacja pozostałych klas jest niedozwolona.
Wymagania dodatkowe:

korzystanie z klas abstrakcyjnych oraz z polimorfizmu jest obowiązkowe
pożądana jest minimalizacja kodu klas ListaZyczen oraz Koszyk
skorzystaj z singletonu w zdefiniowaniu klasy Cennik (w dowolnym momencie dostępny jest tylko jeden cennik)

Ważne uwagi:

Być może są pokoje niemające ceny w cenniku, wtedy przy przepakowaniu z listy życzeń do koszyka są one usuwane z koszyka (ale nie z listy życzeń).
Jeśli klient nie ma wystarczającej ilości pieniędzy na całą zawartość koszyka to zapłaci tylko za część koszyka. Po zapłaceniu, w koszyku zostaje część rezerwacji, za którą klient nie mógł zapłacić (liczba usuniętej rezerwacji danego rodzaju musi być wielokrotnością ceny za 1 noc,  usunięty zostanie najpierw najdroższy rodzaj pokoi).
Niektóre pokoje posiadają cenę krótkoterminową (w przypadku rezerwacji mniejszej liczby nocy niż wcześniej ustalony limit) oraz cenę długoterminową (w przeciwnym przypadku).
Przy płaceniu przelewem klient zapłaci dodatkowo 5 zł prowizji.
Zdefiniowanie odpowiedniej metody toString() w niektórych klasach jest obowiązkowe.
Program powinien działać dla dowolnych danych a nie tylko dla tych podanych w teście.
4

Skoro nie wiesz nawet jak zacząć to może jest za wcześnie na to zadanie? Na jakim etapie jesteś teraz w nauce Javy? Co już przerobiłes?

1 użytkowników online, w tym zalogowanych: 0, gości: 1