Kako dizajnirati parkiralište koristeći objektno orijentirana načela?
Projektiranje parkirališta korištenjem objektno orijentiranih principa uključuje rastavljanje sustava na atribute klasa i metode koje odražavaju entitete stvarnog svijeta. Ključne komponente poput vozila i parkirnih mjesta mogu se modelirati kao objekti, dok se interakcijama poput parkiranja može upravljati putem metoda. Ovaj pristup promiče mogućnost ponovne upotrebe modularnosti i lakoću održavanja čineći sustav jednostavnim za proširenje i upravljanje.
Kako projektirati parkiralište koristeći objektno orijentirane principe? Pretpostavke
Za naše potrebe sada ćemo napraviti sljedeće pretpostavke. Napravili smo ove specifične pretpostavke kako bismo dodali malo složenosti problemu bez dodavanja previše.
- Parkiralište je višeetažno. Svaka razina ima više redova mjesta.
- Na parkingu se mogu parkirati motocikli, automobili i autobusi.
- Parkiralište ima mjesta za motocikle kompaktna mjesta i velika mjesta.
- Motocikl se može parkirati na bilo kojem mjestu.
- Automobil se može parkirati ili na jednom kompaktnom mjestu ili na jednom velikom mjestu.
- Autobus može parkirati na pet velikih mjesta koja su uzastopna i unutar istog reda. Ne može parkirati na malim mjestima. U donjoj implementaciji stvorili smo apstraktnu klasu Vehicle od koje nasljeđuju Car Bus i Motocikl.
Objektno orijentirani dizajn
Počinjemo stvaranjem potrebnih klasa i osiguravanjem da svaka klasa ima jasnu jedinstvenu odgovornost. Razdvojimo dizajn s fokusom na način interakcije svake klase i metode.
1. Klasa vozila
The Vehicle klasa definira zajedničke atribute i ponašanja za sve vrste vozila. Služit će kao osnovna klasa za specifičnije tipove vozila kao što su Bus Car i 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. Konkretne klase vozila
Autobus : Autobus zahtijeva 5 uzastopnih velikih mjesta.
Java public class Bus extends Vehicle { public Bus ( String licensePlate ) { super ( licensePlate VehicleSize . Large ); } public boolean canFitInSpot ( ParkingSpot spot ) { return spot . getSpotSize () == VehicleSize . Large ; } }
Automobil : Automobil se može parkirati na kompaktnim ili velikim mjestima.
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 ; } }
Motocikl : Motocikl se može parkirati na bilo kojem mjestu
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 Klasa
The ParkingSpot klasa predstavlja pojedinačno parkirno mjesto na parkiralištu. Odgovoran je za upravljanje njegovom dostupnošću i provjeru može li određeno vozilo stati na to mjesto.
- Mogli smo ovo implementirati tako da imamo klase za LargeSpot CompactSpot i MotorcycleSpot koje nasljeđuju od ParkingSpota, ali ovo je vjerojatno pretjerano.
- Točke vjerojatno nemaju drugačije ponašanje osim veličine.
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. Klasa razine parkiranja
The Level klasa predstavlja razinu na parkiralištu. Upravlja skupom parkirnih mjesta i pruža metode za parkiranje i uklanjanje vozila.
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 Klasa
The ParkingLot klasa predstavlja cijelo parkiralište. Upravlja s više razina i pruža metode parkiranja i uklanjanja vozila s parkirališta.
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. Klase usluga karata i plaćanja
Za upravljanje ulaznicama i plaćanjima dodajemo Ticket i PaymentService klase.
Klasa karte : Predstavlja kartu koja se izdaje kada se vozilo parkira. Bilježi vrijeme ulaska i izlaska vozila s parkirališta.
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 Class : Odgovoran za izračun naknade za parkiranje i obradu plaćanja.
Java javnost razreda PaymentService { javnost dvostruko izračunatiNaknada ( Ulaznica ulaznica ) { dugo trajanje = ulaznica . getDuration (); // Jednostavni model naknade: `tekst`=