Kaip suprojektuoti automobilių stovėjimo aikštelę naudojant objektinius principus?

Kaip suprojektuoti automobilių stovėjimo aikštelę naudojant objektinius principus?

Stovėjimo aikštelės projektavimas naudojant objektinius principus apima sistemos suskirstymą į klasių atributus ir metodus, kurie atspindi realaus pasaulio esybes. Pagrindiniai komponentai, tokie kaip transporto priemonės ir stovėjimo vietos, gali būti modeliuojami kaip objektai, o sąveika, pvz., parkavimas, gali būti tvarkoma naudojant metodus. Šis metodas skatina modulinį pakartotinį naudojimą ir priežiūrą, todėl sistemą lengva išplėsti ir valdyti.

Kaip suprojektuoti automobilių stovėjimo aikštelę, naudojant objektinius principusKaip suprojektuoti automobilių stovėjimo aikštelę taikant objektinio orientavimo principus?

Prielaidos

Šiuo metu savo tikslams darysime tokias prielaidas. Mes padarėme šias konkrečias prielaidas, kad padidintume problemos sudėtingumą, nepridedant per daug.

  • Automobilių stovėjimo aikštelė yra kelių lygių. Kiekviename lygyje yra kelios taškų eilės.
  • Aikštelėje galima pastatyti motociklus, automobilius ir autobusus.
  • Automobilių stovėjimo aikštelėje yra motociklų vietų, kompaktiškų ir didelių vietų.
  • Motociklas gali stovėti bet kurioje vietoje.
  • Automobilis gali stovėti vienoje kompaktiškoje arba vienoje didelėje vietoje.
  • Autobusas gali stovėti penkiose didelėse vietose, esančiose iš eilės ir toje pačioje eilėje. Jis negali stovėti mažose vietose. Žemiau pateiktame įgyvendinime sukūrėme abstrakčią transporto priemonės klasę, iš kurios paveldi automobilių autobusai ir motociklai.

Objektinis dizainas

Pradedame kurdami reikiamas klases ir užtikrindami, kad kiekviena klasė prisiimtų aiškią atsakomybę. Išskaidykime dizainą, sutelkdami dėmesį į tai, kaip kiekviena klasė ir metodas sąveikauja.

1. Transporto priemonių klasė

The Vehicle klasė apibrėžia bendrus visų tipų transporto priemonių požymius ir elgesį. Tai bus pagrindinė klasė konkretesniems transporto priemonių tipams, pvz Bus Car ir 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. Betoninių transporto priemonių klasės

Autobusas : Autobusui reikia 5 iš eilės didelių vietų.

Java
   public     class   Bus     extends     Vehicle     {      public     Bus  (  String     licensePlate  )     {      super  (  licensePlate       VehicleSize  .  Large  );      }      public     boolean     canFitInSpot  (  ParkingSpot     spot  )     {      return     spot  .  getSpotSize  ()     ==     VehicleSize  .  Large  ;      }   }   

Automobilis : Automobilis gali stovėti tiek kompaktiškose, tiek didelėse vietose.

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

Motociklas : Motociklą galima pastatyti bet kurioje vietoje

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 klasė

The ParkingSpot klasė atstovauja individualią parkavimo vietą aikštelėje. Ji yra atsakinga už prieinamumo valdymą ir patikrinimą, ar konkreti transporto priemonė gali tilpti į vietą.

  • Galėjome tai įgyvendinti turėdami LargeSpot CompactSpot ir MotorcycleSpot klases, kurios paveldės iš ParkingSpot, bet tai tikriausiai per daug.
  • Dėmės tikriausiai nesiskiria kitokiu elgesiu, išskyrus jų dydį. 
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. ParkingLevel klasė

The Level klasė reprezentuoja lygį automobilių stovėjimo aikštelėje. Jis tvarko stovėjimo aikštelių rinkinį ir pateikia metodus, kaip pastatyti ir pašalinti transporto priemones.

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. Parkavimo aikštelės klasė

The ParkingLot klasė atstovauja visą automobilių stovėjimo aikštelę. Jis valdo kelis lygius ir pateikia metodus, kaip pastatyti ir pašalinti transporto priemones iš stovėjimo aikštelės.

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. Bilietų ir mokėjimo paslaugų klasės

Norėdami valdyti bilietus ir mokėjimus, pridedame Ticket ir PaymentService klases.

Bilietų klasė : reiškia bilietą, išduotą, kai transporto priemonė stovi. Jis fiksuoja laiką, kada transporto priemonė įvažiuoja į stovėjimo aikštelę ir išvažiuoja iš jos.

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

Mokėjimo paslaugų klasė : Atsakingas už automobilių stovėjimo mokesčio apskaičiavimą ir mokėjimų apdorojimą.

Java
   viešas     klasė   Mokėjimo paslauga     {      viešas     dvigubai     apskaičiuoti Mokestį  (  Bilietas     bilietas  )     {      ilgas     trukmės     =     bilietas  .  gautiDuration  ();      // Paprastas mokesčio modelis: `tekstas`=