At designe en parkeringsplads ved hjælp af objektorienterede principper involverer at nedbryde systemet i klasser attributter og metoder, der afspejler den virkelige verden enheder. Nøglekomponenter som køretøjer og parkeringspladser kan modelleres som objekter, mens interaktioner såsom parkering kan håndteres gennem metoder. Denne tilgang fremmer modularitets genanvendelighed og vedligeholdelse, hvilket gør systemet nemt at udvide og administrere.
Hvordan designer man en parkeringsplads ved hjælp af objektorienterede principper?Forudsætninger
Til vores formål lige nu vil vi gøre følgende antagelser. Vi lavede disse specifikke antagelser for at tilføje en smule kompleksitet til problemet uden at tilføje for meget.
- Parkeringspladsen har flere niveauer. Hvert niveau har flere rækker af pletter.
- Parkeringspladsen kan parkere motorcykler biler og busser.
- Parkeringspladsen har motorcykelspots kompakte spots og store spots.
- En motorcykel kan parkere hvor som helst.
- En bil kan parkere enten på et enkelt kompakt sted eller et enkelt stort sted.
- En bus kan parkere på fem store pladser, der er på hinanden følgende og inden for samme række. Den kan ikke parkere på små steder. I nedenstående implementering har vi skabt et abstrakt klassekøretøj, som bilbus og motorcykel arver.
Objektorienteret design
Vi begynder med at oprette de nødvendige klasser og sikre, at hver klasse har et klart enkelt ansvar. Lad os nedbryde designet med fokus på, hvordan hver klasse og metode interagerer.
1. Køretøjsklasse
DeVehicleklasse definerer fælles egenskaber og adfærd for alle typer køretøjer. Det vil fungere som en basisklasse for mere specifikke køretøjstyper som f.eksBus 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. Betonkøretøjsklasser
Bus : En bus kræver 5 på hinanden følgende store pladser.
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 på enten kompakte eller store pladser.
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; } }
Motorcykel : En motorcykel 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. Parkeringsplads klasse
DeParkingSpotklasse repræsenterer en individuel parkeringsplads på parkeringspladsen. Det er ansvarligt for at styre dets tilgængelighed og verificere, om et specifikt køretøj kan passe på stedet.
- Vi kunne have implementeret dette ved at have klasser for LargeSpot CompactSpot og MotorcycleSpot, som arver fra ParkingSpot, men dette er sandsynligvis overdøvet.
- Pletterne har sandsynligvis ikke anden adfærd udover deres størrelse.
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. Parkeringsniveau klasse
DeLevelklasse repræsenterer et niveau på parkeringspladsen. Det administrerer en samling af parkeringspladser og giver metoder til at parkere og fjerne køretøjer.
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. Parkeringsplads klasse
DeParkingLotklasse repræsenterer hele parkeringspladsen. Det administrerer flere niveauer og giver metoder til at parkere og fjerne køretøjer fra parkeringspladsen.
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. Billet- og betalingsserviceklasser
For at administrere billetsalg og betalinger tilføjer viTicketogPaymentServiceklasser.
Billetklasse : Repræsenterer den billet, der udstedes, når et køretøj parkerer. Den registrerer det tidspunkt, hvor køretøjet kører ind og ud af parkeringspladsen.
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 } }
Betalingsserviceklasse : Ansvarlig for beregning af parkeringsafgift og behandling af betalinger.
Javaoffentlig klasse Betalingsservice { offentlig dobbelt beregne gebyr(Billet billet) { lang varighed = billet.getDuration(); // Simpel gebyrmodel: `tekst`=