Å designe en parkeringsplass ved å bruke objektorienterte prinsipper innebærer å bryte ned systemet i klasseattributter og metoder som gjenspeiler virkelige enheter. Nøkkelkomponenter som kjøretøy og parkeringsplasser kan modelleres som objekter mens interaksjoner som parkering kan håndteres gjennom metoder. Denne tilnærmingen fremmer modularitet gjenbrukbarhet og vedlikeholdsmuligheter, noe som gjør systemet enkelt å utvide og administrere.
Hvordan designe en parkeringsplass ved hjelp av objektorienterte prinsipper?Forutsetninger
For våre formål akkurat nå vil vi gjøre følgende forutsetninger. Vi gjorde disse spesifikke forutsetningene for å legge til litt kompleksitet til problemet uten å legge til for mye.
- Parkeringsplassen har flere nivåer. Hvert nivå har flere rader med flekker.
- Parkeringsplassen kan parkere motorsykler biler og busser.
- Parkeringsplassen har motorsykkelplasser kompakte flekker og store flekker.
- En motorsykkel kan parkere hvor som helst.
- En bil kan parkere enten på et enkelt kompakt sted eller et enkelt stort sted.
- En buss kan parkere på fem store plasser som er påfølgende og innenfor samme rad. Den kan ikke parkere på små flekker. I implementeringen nedenfor har vi laget en abstrakt klasse kjøretøy som bilbuss og motorsykkel arver fra.
Objektorientert design
Vi begynner med å lage de nødvendige klassene og sørge for at hver klasse har et enkelt ansvar. La oss bryte ned designet med fokus på hvordan hver klasse og metode samhandler.
1. Kjøretøysklasse
DeVehicleklasse definerer vanlige egenskaper og atferd for alle typer kjøretøy. Den vil fungere som en basisklasse for mer spesifikke kjøretøytyper somBus CarogMotorcycle.
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. Betongkjøretøyklasser
Buss : En buss krever 5 store plasser på rad.
Javapublic class Bus extends Vehicle { public Bus(String licensePlate) { super(licensePlate VehicleSize.Large); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Large; } }
Bil : En bil kan parkere enten på kompakte eller store steder.
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; } }
Motorsykkel : En motorsykkel kan parkere hvor som helst
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. ParkingSpot klasse
DeParkingSpotklasse representerer en individuell parkeringsplass på parkeringsplassen. Det er ansvarlig for å administrere tilgjengeligheten og verifisere om et spesifikt kjøretøy kan passe på stedet.
- Vi kunne ha implementert dette ved å ha klasser for LargeSpot CompactSpot og MotorcycleSpot som arver fra ParkingSpot, men dette er sannsynligvis overkill.
- Flekkene har sannsynligvis ikke annen oppførsel enn størrelsen.
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. Parkeringsnivå klasse
DeLevelklasse representerer et nivå på parkeringsplassen. Den administrerer en samling parkeringsplasser og tilbyr metoder for å parkere og fjerne kjøretøy.
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. Parkeringsplass klasse
DeParkingLotklasse representerer hele parkeringsplassen. Den administrerer flere nivåer og gir metoder for å parkere og fjerne kjøretøy fra parkeringsplassen.
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. Billett- og betalingstjenesteklasser
For å administrere billettering og betalinger legger vi tilTicketogPaymentServiceklasser.
Billettklasse : Representerer billetten som utstedes når et kjøretøy parkerer. Den registrerer tiden kjøretøyet går inn og ut av parkeringsplassen.
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 } }
Betalingstjenesteklasse : Ansvarlig for beregning av parkeringsavgift og behandling av innbetalinger.
Javaoffentlig klasse Betalingstjeneste { offentlig dobbelt beregneGebyr(Billett billett) { lang varighet = billett.getDuration(); // Enkel avgiftsmodell: `tekst`=