Dissenyar un aparcament utilitzant principis orientats a objectes implica desglossar el sistema en classes d'atributs i mètodes que reflecteixen entitats del món real. Els components clau com els vehicles i les places d'aparcament es poden modelar com a objectes, mentre que les interaccions com l'aparcament es poden gestionar mitjançant mètodes. Aquest enfocament promou la reutilització i el manteniment de la modularitat fent que el sistema sigui fàcil d'estendre i gestionar.
Com dissenyar un aparcament utilitzant principis orientats a objectes?Hipòtesis
Per als nostres propòsits ara mateix farem les suposicions següents. Hem fet aquestes suposicions específiques per afegir una mica de complexitat al problema sense afegir-hi massa.
- L'aparcament té diversos nivells. Cada nivell té diverses files de punts.
- L'aparcament pot aparcar motos, cotxes i autobusos.
- El pàrquing disposa de places de motos, places compactes i espais grans.
- Una moto pot aparcar a qualsevol lloc.
- Un cotxe pot aparcar en un sol lloc compacte o en un sol gran lloc.
- Un autobús pot aparcar en cinc espais grans consecutius i dins de la mateixa fila. No es pot aparcar en llocs petits. A la implementació següent, hem creat una classe abstracta Vehicle de la qual hereten Car Bus i Motocicleta.
Disseny Orientat a Objectes
Comencem creant les classes necessàries i assegurant que cada classe té una responsabilitat única clara. Desglossem el disseny centrant-nos en com interactuen cada classe i mètode.
1. Classe de vehicles
ElVehicleclasse defineix atributs i comportaments comuns per a tot tipus de vehicles. Servirà com a classe base per a tipus de vehicles més específics comBus CariMotorcycle.
travessa d'arbresJava
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 vehicles de formigó
Autobús : Un autobús requereix 5 espais grans consecutius.
Javapublic class Bus extends Vehicle { public Bus(String licensePlate) { super(licensePlate VehicleSize.Large); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Large; } }
Cotxe : Un cotxe pot aparcar en llocs compactes o grans.
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; } }
Motocicleta : Una moto pot aparcar a qualsevol lloc
què és romJava
public 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 ParkSpot
ElParkingSpotclasse representa una plaça d'aparcament individual a l'aparcament. S'encarrega de gestionar la seva disponibilitat i verificar si un vehicle concret pot cabre al lloc.
- Podríem haver implementat això tenint classes per a LargeSpot CompactSpot i MotorcycleSpot que hereten de ParkingSpot, però això probablement està exagerat.
- Les taques probablement no tenen comportaments diferents a part de les seves mides.
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 d'aparcament
ElLevelclasse representa un nivell a l'aparcament. Gestiona una col·lecció de places d'aparcament i ofereix mètodes per aparcar i retirar vehicles.
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 d'aparcament
ElParkingLotclasse representa tot l'aparcament. Gestiona diversos nivells i proporciona mètodes per aparcar i treure vehicles de l'aparcament.
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 serveis de pagament i entrades
Per gestionar les entrades i els pagaments afegim elTicketiPaymentServiceclasses.
formes normals
Classe d'entrades : Representa el tiquet emès quan un vehicle estaciona. Registra l'hora en què el vehicle entra i surt de l'aparcament.
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 PaymentService : Responsable del càlcul de la tarifa d'aparcament i de la tramitació dels pagaments.
Javapúblic classe Servei de pagament { públic doble calcula la tarifa(Bitllet bitllet) { llarg durada = bitllet.getDuration(); // Model de tarifa simple: `text`=