Wie gestaltet man einen Parkplatz nach objektorientierten Prinzipien?
Beim Entwerfen eines Parkplatzes nach objektorientierten Prinzipien muss das System in Klassen, Attribute und Methoden zerlegt werden, die reale Entitäten widerspiegeln. Schlüsselkomponenten wie Fahrzeuge und Parkplätze können als Objekte modelliert werden, während Interaktionen wie das Parken über Methoden abgewickelt werden können. Dieser Ansatz fördert die Modularität, die Wiederverwendbarkeit und die Wartbarkeit, sodass das System einfach zu erweitern und zu verwalten ist.
Wie gestaltet man einen Parkplatz nach objektorientierten Prinzipien? Annahmen
Für unsere jetzigen Zwecke gehen wir von den folgenden Annahmen aus. Wir haben diese spezifischen Annahmen getroffen, um das Problem etwas komplexer zu gestalten, ohne zu viel hinzuzufügen.
- Der Parkplatz verfügt über mehrere Ebenen. Jede Ebene verfügt über mehrere Reihen von Punkten.
- Auf dem Parkplatz können Motorräder, Autos und Busse abgestellt werden.
- Der Parkplatz verfügt über Motorradstellplätze, Kompaktstellplätze und Großstellplätze.
- Ein Motorrad kann überall geparkt werden.
- Ein Auto kann entweder auf einem einzigen kompakten Parkplatz oder auf einem einzigen großen Parkplatz geparkt werden.
- Ein Bus kann auf fünf großen Stellplätzen hintereinander und in derselben Reihe parken. Es kann nicht an kleinen Stellen geparkt werden. In der folgenden Implementierung haben wir eine abstrakte Klasse Vehicle erstellt, von der Car Bus und Motorcycle erben.
Objektorientiertes Design
Wir beginnen mit der Erstellung der erforderlichen Klassen und stellen sicher, dass jede Klasse eine klare Einzelverantwortung hat. Lassen Sie uns das Design aufschlüsseln und dabei den Schwerpunkt auf die Interaktion der einzelnen Klassen und Methoden legen.
1. Fahrzeugklasse
Der Vehicle Die Klasse definiert gemeinsame Attribute und Verhaltensweisen für alle Fahrzeugtypen. Es dient als Basisklasse für spezifischere Fahrzeugtypen wie z Bus Car Und Motorcycle .
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. Konkrete Fahrzeugklassen
Bus : Ein Bus benötigt 5 aufeinanderfolgende große Plätze.
Java public class Bus extends Vehicle { public Bus ( String licensePlate ) { super ( licensePlate VehicleSize . Large ); } public boolean canFitInSpot ( ParkingSpot spot ) { return spot . getSpotSize () == VehicleSize . Large ; } }
Auto : Ein Auto kann sowohl auf kompakten als auch auf großen Parkplätzen parken.
Java public 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 ; } }
Motorrad : Ein Motorrad kann an jedem Ort parken
Java 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. ParkingSpot-Klasse
Der ParkingSpot Die Klasse repräsentiert einen einzelnen Parkplatz auf dem Parkplatz. Es ist dafür verantwortlich, die Verfügbarkeit zu verwalten und zu überprüfen, ob ein bestimmtes Fahrzeug an die Stelle passt.
- Wir hätten dies implementieren können, indem wir Klassen für LargeSpot CompactSpot und MotorcycleSpot hätten, die von ParkingSpot erben, aber das ist wahrscheinlich übertrieben.
- Abgesehen von ihrer Größe weisen die Flecken wahrscheinlich keine anderen Verhaltensweisen auf.
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. ParkingLevel-Klasse
Der Level Die Klasse repräsentiert eine Ebene auf dem Parkplatz. Es verwaltet eine Sammlung von Parkplätzen und bietet Methoden zum Parken und Entfernen von Fahrzeugen.
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. ParkingLot-Klasse
Der ParkingLot Die Klasse repräsentiert den gesamten Parkplatz. Es verwaltet mehrere Ebenen und bietet Methoden zum Parken und Entfernen von Fahrzeugen auf dem Parkplatz.
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. Ticket- und PaymentService-Klassen
Um den Ticketverkauf und die Zahlungen zu verwalten, fügen wir das hinzu Ticket Und PaymentService Klassen.
Ticketklasse : Stellt das Ticket dar, das beim Parken eines Fahrzeugs ausgestellt wird. Es erfasst die Zeit, zu der das Fahrzeug den Parkplatz betritt und verlässt.
Java public 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 } }
PaymentService-Klasse : Verantwortlich für die Berechnung der Parkgebühr und die Abwicklung der Zahlungen.
Java öffentlich Klasse Zahlungsservice { öffentlich doppelt berechnenGebühr ( Ticket Ticket ) { lang Dauer = Ticket . getDuration (); // Einfaches Gebührenmodell: `text`=