Une entreprise souhaite gérer un parc de véhicules variés pour proposer des locations courtes et moyennes durées.
Le parc contient des véhicules de plusieurs familles :
L’entreprise loue aussi bien des véhicules électriques que thermiques, mais aussi des véhicules à énergie humaine ou à voile.
Elle veut pouvoir :
L’application sera entièrement realisée en Java, sans framework.
Ce TP permet de travailler toutes les notions abordées depuis la semaine dernière et cette semaine, soit :
Créer une classe abstraite Vehicule contenant au minimum :
Vehicule
Cette classe devra proposer :
getTypeVehicule()
calculerPrixLocation(int dureeJours)
calculerCoutEntretienEstime()
decrire()
toString()
Créer 3 sous-classes abstraites :
VehiculeTerrestre
VehiculeMaritime
VehiculeAerien
Puis créer plusieurs véhicules concrets, par exemple :
VoitureElectrique
VoitureThermique
CamionThermique
MotoElectrique
BateauThermique
Voilier
DroneElectrique
HelicoptereThermique
Chaque classe concrète devra redéfinir au minimum :
calculerPrixLocation(...)
Créer les interfaces suivantes :
Louable
double calculerPrixLocation(int dureeJours) throws DureeLocationInvalideException;
Rechargeable
void recharger(double quantite) throws NiveauEnergieInvalideException;
double getNiveauBatterie();
Ravitaillable
void ravitailler(double quantite) throws NiveauEnergieInvalideException;
double getNiveauCarburant();
Navigable
void appareiller();
void amarrer();
Volant
void decoller();
void atterrir();
boolean isCrasher();
Du coup, ça veut dire que chaque interface correspond à une ou plusieurs responsabilités :
Un même véhicule peut hériter d’une classe et implémenter une ou plusieurs interfaces. Comme je l’ai expliqué, un classe qui implements une interface signe un contrat avec cette interface et doit par conséquent implémenter toutes les méthodes de l’interface. Ce qui veut dire écrire le code dans les méthodes, c’est ce que l’on nomme l’implémentation.
Créer les classes :
Client
Reservation
Location
Chaque reservation doit contenir :
Chaque location doit permettre de suivre :
Créer une classe AgenceLocation qui contient des collections pour gérer :
AgenceLocation
Cette classe devra proposer des méthodes métier du type :
ajouterVehicule(...)
ajouterClient(...)
reserverVehicule(...)
demarrerLocation(...)
retournerVehicule(...)
listerVehiculesDisponibles()
listerVehiculesParCategorie(...)
listerVehiculesElectriquesRechargeables()
trierVehiculesParTarif()
calculerChiffreAffairesTotal()
compterVehiculesParEnergie()
Les méthodes de recherche, de tri et de statistiques devront utiliser les Streams (ou pas selon votre sensibilité ;))
Créer plusieurs exceptions personnalisées, par exemple :
VehiculeInconnuException
ClientInconnuException
VehiculeIndisponibleException
ReservationInvalideException
ReservationIntrouvableException
LocationIntrouvableException
DureeLocationInvalideException
NiveauEnergieInvalideException
Chaque exception doit correspondre à un vrai problème metier !
Créer une classe Application contenant une méthode main() qui :
Application
main()
Le programme doit au minimum permettre de démontrer :