Concevoir un parking à l'aide de principes orientés objet implique de décomposer le système en classes d'attributs et de méthodes qui reflètent les entités du monde réel. Les composants clés tels que les véhicules et les places de stationnement peuvent être modélisés sous forme d'objets, tandis que les interactions telles que le stationnement peuvent être gérées via des méthodes. Cette approche favorise la réutilisabilité et la maintenabilité de la modularité, ce qui rend le système facile à étendre et à gérer.
Comment concevoir un parking en utilisant les principes orientés objet ?Hypothèses
Pour nos besoins actuels, nous ferons les hypothèses suivantes. Nous avons fait ces hypothèses spécifiques pour ajouter un peu de complexité au problème sans trop en ajouter.
- Le parking comporte plusieurs niveaux. Chaque niveau comporte plusieurs rangées de spots.
- Le parking permet de garer des motos, des voitures et des bus.
- Le parking dispose de places moto compactes et de grandes places.
- Une moto peut se garer n’importe où.
- Une voiture peut se garer soit dans un seul emplacement compact, soit dans un seul grand emplacement.
- Un bus peut se garer sur cinq grandes places consécutives et situées dans la même rangée. Il ne peut pas se garer dans des emplacements restreints. Dans l'implémentation ci-dessous, nous avons créé une classe abstraite Vehicle dont héritent Car Bus et Motorcycle.
Conception orientée objet
Nous commençons par créer les classes nécessaires et veillons à ce que chaque classe ait une responsabilité unique et claire. Décomposons la conception en nous concentrant sur la façon dont chaque classe et méthode interagit.
1. Classe de véhicule
LeVehicleLa classe définit des attributs et des comportements communs à tous les types de véhicules. Il servira de classe de base pour des types de véhicules plus spécifiques commeBus CaretMotorcycle.
public abstract class Vehicle { protected String licensePlate; protected int spotsNeeded; protected VehicleSize size; public Vehicle(String licensePlate VehicleSize size) { this.licensePlate = licensePlate; this.size = size; this.spotsNeeded = (size == VehicleSize.Large) ? 5 : 1; } public int getSpotsNeeded() { return spotsNeeded; } public VehicleSize getSize() { return size; } public String getLicensePlate() { return licensePlate; } public abstract boolean canFitInSpot(ParkingSpot spot); }
2. Classes de véhicules en béton
Bus : Un bus nécessite 5 grands emplacements consécutifs.
Javapublic class Bus extends Vehicle { public Bus(String licensePlate) { super(licensePlate VehicleSize.Large); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Large; } }
Voiture : Une voiture peut se garer dans des emplacements compacts ou grands.
Javapublic class Car extends Vehicle { public Car(String licensePlate) { super(licensePlate VehicleSize.Compact); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Compact || spot.getSpotSize() == VehicleSize.Large; } }
Moto : Une moto peut se garer n'importe où
Javapublic class Motorcycle extends Vehicle { public Motorcycle(String licensePlate) { super(licensePlate VehicleSize.Motorcycle); } public boolean canFitInSpot(ParkingSpot spot) { return true; // Can park in any spot } }
3. Classe ParkingSpot
LeParkingSpotla classe représente une place de stationnement individuelle dans le parking. Il est chargé de gérer sa disponibilité et de vérifier si un véhicule spécifique peut tenir sur place.
- Nous aurions pu implémenter cela en ayant des classes pour LargeSpot CompactSpot et MotorcycleSpot qui héritent de ParkingSpot mais c'est probablement exagéré.
- Les taches n’ont probablement pas de comportements différents autre que leur taille.
public class ParkingSpot { private Vehicle vehicle; private VehicleSize spotSize; private int row; private int spotNumber; private Level level; public ParkingSpot(Level level int row int spotNumber VehicleSize spotSize) { this.level = level; this.row = row; this.spotNumber = spotNumber; this.spotSize = spotSize; this.vehicle = null; } public boolean isAvailable() { return vehicle == null; } public boolean canFitVehicle(Vehicle vehicle) { return isAvailable() && vehicle.canFitInSpot(this); } public void parkVehicle(Vehicle vehicle) { if (canFitVehicle(vehicle)) { this.vehicle = vehicle; } } public void removeVehicle() { this.vehicle = null; } public VehicleSize getSpotSize() { return spotSize; } public int getRow() { return row; } public int getSpotNumber() { return spotNumber; } }
4. Classe de niveau de stationnement
LeLevella classe représente un niveau dans le parking. Il gère un ensemble de places de stationnement et fournit des méthodes pour garer et retirer les véhicules.
public class Level { private int levelNumber; private ParkingSpot[] spots; public Level(int levelNumber int numSpots) { this.levelNumber = levelNumber; this.spots = new ParkingSpot[numSpots]; } public boolean parkVehicle(Vehicle vehicle) { for (ParkingSpot spot : spots) { if (spot.canFitVehicle(vehicle)) { spot.parkVehicle(vehicle); return true; } } return false; } public boolean removeVehicle(Vehicle vehicle) { for (ParkingSpot spot : spots) { if (spot.isOccupied() && spot.getVehicle().equals(vehicle)) { spot.removeVehicle(); return true; } } return false; } }
5. Classe de stationnement
LeParkingLotla classe représente l’ensemble du parking. Il gère plusieurs niveaux et fournit des méthodes pour garer et retirer les véhicules du parking.
public class ParkingLot { private Level[] levels; public ParkingLot(int numLevels int numSpotsPerLevel) { levels = new Level[numLevels]; for (int i = 0; i < numLevels; i++) { levels[i] = new Level(i numSpotsPerLevel); } } public boolean parkVehicle(Vehicle vehicle) { for (Level level : levels) { if (level.parkVehicle(vehicle)) { return true; } } return false; // Parking failed (no spots available) } public boolean removeVehicle(Vehicle vehicle) { for (Level level : levels) { if (level.removeVehicle(vehicle)) { return true; } } return false; // Removal failed (vehicle not found) } }
6. Classes de billets et de services de paiement
Pour gérer la billetterie et les paiements, nous ajoutons leTicketetPaymentServicecours.
Classe de billet : Représente le ticket délivré lorsqu'un véhicule stationne. Il enregistre l'heure à laquelle le véhicule entre et sort du parking.
Javapublic class Ticket { private Vehicle vehicle; private Date issueTime; private Date exitTime; public Ticket(Vehicle vehicle) { this.vehicle = vehicle; this.issueTime = new Date(); } public void setExitTime(Date exitTime) { this.exitTime = exitTime; } public long getDuration() { return (exitTime.getTime() - issueTime.getTime()) / 1000; // Time in seconds } }
Classe de service de paiement : Responsable du calcul des frais de stationnement et du traitement des paiements.
Javapublique classe Service de paiement { publique double calculer les frais(Billet billet) { long durée = billet.getDurée(); // Modèle de frais simple : `text`=