Service de location de véhicules
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy. Leçon 87 sur 87.
Pour ce défi final, vous allez créer un système de service de location de véhicules qui réunit tous les concepts de POO que vous avez maîtrisés au cours de cette formation.
Votre système doit modéliser une flotte de différents types de véhicules. Considérez une classe de base Vehicle avec des propriétés communes telles que la plaque d'immatriculation, la marque et le tarif de location journalier. Les sous-classes telles que Car, Motorcycle et Truck peuvent étendre cela avec des attributs spécifiques comme le nombre de sièges, la cylindrée du moteur ou la capacité de chargement.
Les interfaces peuvent définir des comportements de location : une interface Rentable peut déclarer des méthodes telles que rent(), returnVehicle() et calculateCost(int days). Différents types de véhicules peuvent implémenter les stratégies de tarification différemment, ce qui en fait un cas d’utilisation parfait du polymorphisme.
Réfléchissez à la manière dont une classe RentalAgency gère la flotte en utilisant la composition.
Les exceptions personnalisées comme VehicleNotAvailableException peuvent gérer les cas particuliers.
Vous pourriez appliquer le patron de conception Factory pour créer des véhicules ou utiliser des enums pour les catégories de véhicules et le statut de location.
Ce défi teste votre capacité à concevoir un système de POO complet et bien structuré. Bonne chance !
Défi
FacileConstruisons un service complet de location de véhicules qui rassemble tout ce que vous avez appris sur la POO ! Vous allez créer un système qui gère une flotte de différents types de véhicules, prend en charge les locations avec une validation appropriée et utilise le modèle factory pour créer des véhicules.
Vous organiserez votre code sur sept fichiers :
RentalStatus.java: créez une énumération représentant le statut de location d’un véhicule. Incluez les valeursAVAILABLE,RENTEDetMAINTENANCE. Ajoutez un champ privédescription(String), un constructeur et un getter. La valeur available doit avoir pour description "ready to rent", rented doit avoir "currently in use" et maintenance doit avoir "under service".VehicleNotAvailableException.java: créez une exception personnalisée qui étendException. Le constructeur doit accepter une plaque d’immatriculation et créer un message au formatVehicle not available: [licensePlate].Rentable.java: créez une interface définissant les opérations de location. Déclarez les méthodesrent()qui retourne un booléen,returnVehicle()qui retourne un booléen etcalculateCost(int days)qui retourne un double.Vehicle.java: créez une classe de base abstraite pour tous les véhicules. Incluez des champs privés pourlicensePlate(String),brand(String),dailyRate(double) etstatus(RentalStatus, initialisé à AVAILABLE). Le constructeur accepte licensePlate, brand et dailyRate. Incluez les getters appropriés ainsi qu’un setter pour status. Déclarez une méthode abstraitegetVehicleType()retournant un String. Implémentez une méthodegetDetails()qui retourne"[licensePlate] [brand] ([vehicleType]) - $[dailyRate]/day - [status description]", avec dailyRate formaté avec 2 décimales.Car.java: créez une classe qui étend Vehicle et implémente Rentable. Ajoutez un champ privéseats(int). Le constructeur accepte licensePlate, brand, dailyRate et seats. ImplémentezgetVehicleType()pour retourner"Car". Pourrent(), si le statut est AVAILABLE, définissez-le sur RENTED et retournez true ; sinon, retournez false. PourreturnVehicle(), si le statut est RENTED, définissez-le sur AVAILABLE et retournez true ; sinon, retournez false. PourcalculateCost(int days), retournez dailyRate multiplié par days.Motorcycle.java: créez une classe qui étend Vehicle et implémente Rentable. Ajoutez un champ privéengineCC(int). Le constructeur accepte licensePlate, brand, dailyRate et engineCC. ImplémentezgetVehicleType()pour retourner"Motorcycle". Implémentez les méthodes de Rentable de la même manière que pour Car, maiscalculateCost()doit appliquer une remise de 10 % (multiplication par 0.9).RentalAgency.java: créez une classe qui gère la flotte de véhicules à l’aide d’une ArrayList. Incluez les méthodes suivantes :addVehicle(Vehicle vehicle)- ajoute un véhicule à la flottefindVehicle(String licensePlate)- retourne le Vehicle ou nullrentVehicle(String licensePlate, int days)- trouve le véhicule, tente de le louer (en effectuant un transtypage vers Rentable) et retourne le coût de location. LancezVehicleNotAvailableExceptionsi le véhicule est introuvable ou si rent() retourne falsereturnVehicle(String licensePlate)- trouve et restitue le véhicule, en retournant true en cas de succèsgetAvailableVehicles()- retourne une ArrayList de véhicules dont le statut est AVAILABLE
Main.java: construisez votre service de location ! Vous recevrez une chaîne de commandes séparées par des virgules :ADD_CAR:licensePlate:brand:dailyRate:seatsADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCCRENT:licensePlate:daysRETURN:licensePlateAVAILABLE
Traitez chaque commande et affichez :
- ADD_CAR/ADD_MOTORCYCLE :
Added: [brand] ([vehicleType]) - RENT :
Rented [licensePlate] for [days] days - Total: $[cost](coût avec 2 décimales), ouError: [exception message] - RETURN :
Returned: [licensePlate]ouReturn failed: [licensePlate] - AVAILABLE : affichez
Available vehicles:, suivi des détails de chaque véhicule disponible sur des lignes distinctes
Après toutes les commandes, affichez
--- Fleet Summary ---, suivi des détails de chaque véhicule.
Vous recevrez une entrée : la chaîne de commandes séparées par des virgules.
Par exemple, avec l’entrée ADD_CAR:ABC-123:Toyota:50.00:5,ADD_MOTORCYCLE:XYZ-789:Honda:40.00:600,RENT:ABC-123:3,RENT:ABC-123:2,AVAILABLE,RETURN:ABC-123, votre sortie serait :
Added: Toyota (Car)
Added: Honda (Motorcycle)
Rented ABC-123 for 3 days - Total: $150.00
Error: Vehicle not available: ABC-123
Available vehicles:
XYZ-789 Honda (Motorcycle) - $40.00/day - ready to rent
Returned: ABC-123
--- Fleet Summary ---
ABC-123 Toyota (Car) - $50.00/day - ready to rent
XYZ-789 Honda (Motorcycle) - $40.00/day - ready to rentCe défi combine l’héritage (hiérarchie Vehicle), les interfaces (Rentable), les énumérations (RentalStatus), les exceptions personnalisées, le polymorphisme (traiter uniformément différents types de véhicules) et la composition (RentalAgency gérant les véhicules) en un système complet de service de location !
Essayez vous-même
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: Créer une instance de RentalAgency
// TODO: Diviser l'entrée par des virgules pour obtenir les commandes individuelles
// TODO: Traiter chaque commande :
// ADD_CAR:licensePlate:brand:dailyRate:seats -> afficher "Added: [brand] ([vehicleType])"
// ADD_MOTORCYCLE:licensePlate:brand:dailyRate:engineCC -> afficher "Added: [brand] ([vehicleType])"
// RENT:licensePlate:days -> afficher "Rented [licensePlate] for [days] days - Total: $[cost]" (2 décimales)
// ou "Error: [exception message]" si une exception est levée
// RETURN:licensePlate -> afficher "Returned: [licensePlate]" ou "Return failed: [licensePlate]"
// AVAILABLE -> afficher "Available vehicles:" suivi des détails de chaque véhicule disponible
// TODO: Après toutes les commandes, afficher "--- Fleet Summary ---"
// suivi des détails de chaque véhicule
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie14Défis finaux
Plateforme d'E-LearningSystème bancaireDéveloppement de personnages de jeuService de location de véhicules3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron ItérateurEntraînez-vous par vous-même : Compilateur Java en ligne