Проектування автостоянки з використанням об’єктно-орієнтованих принципів передбачає розбиття системи на атрибути класів і методи, які відображають сутності реального світу. Ключові компоненти, такі як транспортні засоби та паркувальні місця, можна моделювати як об’єкти, тоді як взаємодії, такі як паркування, можна обробляти за допомогою методів. Цей підхід сприяє багаторазовому використанню модульності та зручності обслуговування, завдяки чому систему легко розширювати та керувати нею.
Як спроектувати паркінг за об'єктно-орієнтованими принципами?Припущення
Для наших цілей зараз ми зробимо наступні припущення. Ми зробили ці конкретні припущення, щоб трохи ускладнити проблему, не додаючи зайвого.
- Паркінг багаторівневий. Кожен рівень має кілька рядів плям.
- На парковці можна паркувати мотоцикли, легкові автомобілі та автобуси.
- На парковці є місця для мотоциклів компактні місця та великі місця.
- Мотоцикл можна припаркувати в будь-якому місці.
- Автомобіль можна припаркувати як на одному компактному місці, так і на одному великому місці.
- Автобус може припаркуватися на п’яти великих місцях, розташованих підряд і в одному ряду. Він не може паркуватися на маленьких місцях. У наведеній нижче реалізації ми створили абстрактний клас Vehicle, від якого успадковуються Car Bus і Motorcycle.
Об'єктно-орієнтований дизайн
Ми починаємо зі створення необхідних класів і гарантуємо, що кожен клас має чітку єдину відповідальність. Давайте розберемо дизайн, зосередившись на тому, як взаємодіють кожен клас і метод.
1. Клас транспортного засобу
TheVehicleклас визначає загальні атрибути та поведінку для всіх типів транспортних засобів. Він слугуватиме базовим класом для більш конкретних типів транспортних засобів, наприклад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 послідовних великих місць.
Javapublic 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
TheParkingSpotклас являє собою окреме місце паркування на автостоянці. Він відповідає за керування його доступністю та перевірку того, чи може конкретний транспортний засіб поміститися на місці.
- Ми могли б реалізувати це, маючи класи для LargeSpot CompactSpot і MotorcycleSpot, які успадковують 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. Клас рівня паркування
TheLevelклас представляє рівень на стоянці. Він керує набором паркувальних місць і надає методи паркування та видалення транспортних засобів.
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. Клас парковки
TheParkingLotклас представляє всю стоянку. Він керує кількома рівнями та надає методи паркування та вивезення транспортних засобів зі стоянки.
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 } }
Клас PaymentService : Відповідає за розрахунок плати за паркування та обробку платежів.
Javaгромадськість клас PaymentService { громадськість подвійний розрахуватиКомісію(Квиток квиток) { довго тривалість = квиток.getDuration(); // Проста модель оплати: `text`=