Како дизајнирати паркиралиште користећи објектно оријентисане принципе?
Дизајнирање паркинга коришћењем објектно оријентисаних принципа укључује разбијање система на класе атрибута и метода које одражавају ентитете из стварног света. Кључне компоненте као што су возила и паркинг простори могу се моделовати као објекти, док се интеракцијама као што је паркирање може управљати методама. Овај приступ промовише могућност поновне употребе модуларности и могућност одржавања, чинећи систем лаким за проширење и управљање.
Како дизајнирати паркинг користећи објектно оријентисане принципе? Претпоставке
За наше потребе сада ћемо направити следеће претпоставке. Направили смо ове специфичне претпоставке да бисмо додали мало сложености проблему без додавања превише.
- Паркинг има више нивоа. Сваки ниво има више редова тачака.
- Паркинг може паркирати мотоцикле аутомобиле и аутобусе.
- Паркинг има мотоцикл спотове компактне и велике тачке.
- Мотоцикл се може паркирати на било ком месту.
- Аутомобил може да се паркира на једном компактном месту или на једном великом месту.
- Аутобус може паркирати на пет великих места која су узастопна и унутар истог реда. Не може да се паркира на малим местима. У доњој имплементацији креирали смо апстрактну класу Возило од које наслеђују Аутобус и Мотоцикл.
Објектно-оријентисани дизајн
Почињемо стварањем неопходних класа и осигуравањем да свака класа има јасну јединствену одговорност. Хајде да разложимо дизајн са фокусом на то како свака класа и метод интерагују.
1. Класа возила
Тхе Vehicle класа дефинише заједничке атрибуте и понашања за све типове возила. Служиће као основна класа за специфичније типове возила као што су Bus Car и 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. Класе бетонских возила
Аутобус : За аутобус је потребно 5 узастопних великих места.
Java public class Bus extends Vehicle { public Bus ( String licensePlate ) { super ( licensePlate VehicleSize . Large ); } public boolean canFitInSpot ( ParkingSpot spot ) { return spot . getSpotSize () == VehicleSize . Large ; } }
Ауто : Аутомобил се може паркирати на компактним или великим местима.
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 ; } }
Мотоцикл : Мотоцикл може да се паркира на било ком месту
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 класа представља појединачно паркинг место на паркингу. Он је одговоран за управљање његовом доступношћу и проверу да ли одређено возило може да стане на лицу места.
- Могли смо ово да имплементирамо тако што смо имали класе за ЛаргеСпот ЦомпацтСпот и МоторцицлеСпот које су наследиле од ПаркингСпот-а, али ово је вероватно претерано.
- Тачке вероватно немају другачије понашање осим величине.
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. ПаркингЛевел Цласс
Тхе Level класа представља ниво на паркингу. Он управља скупом паркинг места и обезбеђује методе за паркирање и уклањање возила.
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 класа представља цео паркинг. Управља више нивоа и пружа методе за паркирање и уклањање возила са паркинга.
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 и PaymentService класе.
Тицкет Цласс : Представља карту која се издаје када се возило паркира. Бележи време када возило улази и излази на паркинг.
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 } }
ПаиментСервице Цласс : Одговоран за обрачун накнаде за паркирање и обраду плаћања.
Јава јавности класе ПаиментСервице { јавности дупло израчунатиФее ( Тицкет карту ) { дуго трајање = карту . гетДуратион (); // Једноставан модел накнаде: `тект`=