Jak navrhnout parkoviště pomocí objektově orientovaných principů?
Návrh parkoviště pomocí objektově orientovaných principů zahrnuje rozdělení systému do tříd atributů a metod, které odrážejí entity reálného světa. Klíčové komponenty, jako jsou vozidla a parkovací místa, lze modelovat jako objekty, zatímco interakce, jako je parkování, lze řešit pomocí metod. Tento přístup podporuje opětovnou použitelnost a udržovatelnost modularity, což usnadňuje rozšiřování a správu systému.
Jak navrhnout parkoviště pomocí objektově orientovaných principů? Předpoklady
Pro naše účely nyní učiníme následující předpoklady. Udělali jsme tyto konkrétní předpoklady, abychom problém trochu zkomplikovali, aniž bychom přidali příliš mnoho.
- Parkoviště má několik úrovní. Každá úroveň má několik řad bodů.
- Na parkovišti je možné zaparkovat motorky, auta a autobusy.
- Parkoviště má místa pro motocykly kompaktní a velká místa.
- Motocykl může zaparkovat na jakémkoli místě.
- Auto může zaparkovat buď na jednom kompaktním místě, nebo na jednom velkém místě.
- Autobus může zaparkovat na pěti velkých místech, která jdou za sebou a ve stejné řadě. Nemůže parkovat na malých místech. V níže uvedené implementaci jsme vytvořili abstraktní třídu Vehicle, ze které dědí Car Bus a Motocycle.
Objektově orientovaný design
Začneme tím, že vytvoříme potřebné třídy a zajistíme, aby každá třída měla jasnou jedinou odpovědnost. Pojďme si návrh rozebrat se zaměřením na to, jak jednotlivé třídy a metody interagují.
1. Třída vozidla
The Vehicle třída definuje společné atributy a chování pro všechny typy vozidel. Bude sloužit jako základní třída pro specifičtější typy vozidel, jako je Bus Car a 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. Konkrétní třídy vozidel
Autobus : Autobus vyžaduje 5 po sobě jdoucích velkých míst.
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 : Auto může zaparkovat na kompaktních nebo velkých místech.
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 ; } }
Motocykl : Motocykl může zaparkovat na jakémkoli místě
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. Třída ParkingSpot
The ParkingSpot třídy představuje samostatné parkovací místo na parkovišti. Je odpovědný za řízení jeho dostupnosti a ověřování, zda se konkrétní vozidlo vejde na místo.
- Mohli jsme to implementovat tak, že bychom měli třídy pro LargeSpot CompactSpot a MotorcycleSpot, které dědí z ParkingSpot, ale to je pravděpodobně přehnané.
- Skvrny pravděpodobně nemají jiné chování než jejich velikosti.
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. Třída úrovně parkování
The Level třídy představuje úroveň na parkovišti. Spravuje sbírku parkovacích míst a poskytuje způsoby, jak zaparkovat a odstranit vozidla.
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. Třída parkoviště
The ParkingLot třídy představuje celé parkoviště. Spravuje více úrovní a poskytuje způsoby, jak zaparkovat a odstranit vozidla z parkoviště.
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. Třídy vstupenek a plateb
Pro správu jízdenek a plateb přidáváme Ticket a PaymentService třídy.
Třída vstupenek : Představuje lístek vydaný při zaparkování vozidla. Zaznamenává dobu vjezdu a výjezdu vozidla z parkoviště.
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 } }
Třída PaymentService : Zodpovídá za výpočet parkovného a zpracování plateb.
Jáva veřejnost třída Platební služba { veřejnost dvojnásobek vypočítatPoplatek ( Lístek lístek ) { dlouho trvání = lístek . getDuration (); // Jednoduchý model poplatků: `text`=