Як спроектувати автостоянку з використанням об’єктно-орієнтованих принципів?

Як спроектувати автостоянку з використанням об’єктно-орієнтованих принципів?

Проектування автостоянки з використанням об’єктно-орієнтованих принципів передбачає розбиття системи на атрибути класів і методи, які відображають сутності реального світу. Ключові компоненти, такі як транспортні засоби та паркувальні місця, можна моделювати як об’єкти, тоді як взаємодії, такі як паркування, можна обробляти за допомогою методів. Цей підхід сприяє багаторазовому використанню модульності та зручності обслуговування, завдяки чому систему легко розширювати та керувати нею.

Як-спроектувати-стоянку-за-обЯк спроектувати паркінг за об'єктно-орієнтованими принципами?

Припущення

Для наших цілей зараз ми зробимо наступні припущення. Ми зробили ці конкретні припущення, щоб трохи ускладнити проблему, не додаючи зайвого.

  • Паркінг багаторівневий. Кожен рівень має кілька рядів плям.
  • На парковці можна паркувати мотоцикли, легкові автомобілі та автобуси.
  • На парковці є місця для мотоциклів компактні місця та великі місця.
  • Мотоцикл можна припаркувати в будь-якому місці.
  • Автомобіль можна припаркувати як на одному компактному місці, так і на одному великому місці.
  • Автобус може припаркуватися на п’яти великих місцях, розташованих підряд і в одному ряду. Він не може паркуватися на маленьких місцях. У наведеній нижче реалізації ми створили абстрактний клас Vehicle, від якого успадковуються Car Bus і Motorcycle.

Об'єктно-орієнтований дизайн

Ми починаємо зі створення необхідних класів і гарантуємо, що кожен клас має чітку єдину відповідальність. Давайте розберемо дизайн, зосередившись на тому, як взаємодіють кожен клас і метод.

1. Клас транспортного засобу

The Vehicle клас визначає загальні атрибути та поведінку для всіх типів транспортних засобів. Він слугуватиме базовим класом для більш конкретних типів транспортних засобів, наприклад Bus Car і Motorcycle .

Java
   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

The ParkingSpot клас являє собою окреме місце паркування на автостоянці. Він відповідає за керування його доступністю та перевірку того, чи може конкретний транспортний засіб поміститися на місці.

  • Ми могли б реалізувати це, маючи класи для LargeSpot CompactSpot і MotorcycleSpot, які успадковують ParkingSpot, але це, мабуть, надмірно.
  • Плями, ймовірно, не відрізняються за поведінкою, крім їхнього розміру. 
Java
   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. Клас рівня паркування

The 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. Клас парковки

The ParkingLot клас представляє всю стоянку. Він керує кількома рівнями та надає методи паркування та вивезення транспортних засобів зі стоянки.

Java
   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      }   }   

Клас PaymentService : Відповідає за розрахунок плати за паркування та обробку платежів.

Java
   громадськість     клас   PaymentService     {      громадськість     подвійний     розрахуватиКомісію  (  Квиток     квиток  )     {      довго     тривалість     =     квиток  .  getDuration  ();      // Проста модель оплати: `text`=