Дизајнирање паркинга коришћењем објектно оријентисаних принципа укључује разбијање система на класе атрибута и метода које одражавају ентитете из стварног света. Кључне компоненте као што су возила и паркинг простори могу се моделовати као објекти, док се интеракцијама као што је паркирање може управљати методама. Овај приступ промовише могућност поновне употребе модуларности и могућност одржавања, чинећи систем лаким за проширење и управљање.
Како дизајнирати паркинг користећи објектно оријентисане принципе?Претпоставке
За наше потребе сада ћемо направити следеће претпоставке. Направили смо ове специфичне претпоставке да бисмо додали мало сложености проблему без додавања превише.
хасхмап
- Паркинг има више нивоа. Сваки ниво има више редова тачака.
- Паркинг може паркирати мотоцикле аутомобиле и аутобусе.
- Паркинг има мотоцикл спотове компактне и велике тачке.
- Мотоцикл се може паркирати на било ком месту.
- Аутомобил може да се паркира на једном компактном месту или на једном великом месту.
- Аутобус може паркирати на пет великих места која су узастопна и унутар истог реда. Не може да се паркира на малим местима. У доњој имплементацији креирали смо апстрактну класу Возило од које наслеђују Аутобус и Мотоцикл.
Објектно-оријентисани дизајн
Почињемо стварањем неопходних класа и осигуравањем да свака класа има јасну јединствену одговорност. Хајде да разложимо дизајн са фокусом на то како свака класа и метод интерагују.
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; } }
Ауто : Аутомобил се може паркирати на компактним или великим местима.
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; } }
Мотоцикл : Мотоцикл може да се паркира на било ком месту
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. ПаркингСпот Цласс
Тхе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класа представља ниво на паркингу. Он управља скупом паркинг места и обезбеђује методе за паркирање и уклањање возила.
тип у јаваJava
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класе.
Тицкет Цласс : Представља карту која се издаје када се возило паркира. Бележи време када возило улази и излази на паркинг.
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 } }
ПаиментСервице Цласс : Одговоран за обрачун накнаде за паркирање и обраду плаћања.
Јавајавности класе ПаиментСервице { јавности дупло израчунатиФее(Тицкет карту) { дуго трајање = карту.гетДуратион(); // Једноставан модел накнаде: `тект`=