Kuinka suunnitella parkkipaikka olioperiaatteiden avulla?

Kuinka suunnitella parkkipaikka olioperiaatteiden avulla?

Pysäköintialueen suunnittelussa oliopohjaisia ​​periaatteita käyttäen jaetaan järjestelmä luokkien attribuutteihin ja menetelmiin, jotka heijastavat todellisia kokonaisuuksia. Keskeisiä komponentteja, kuten ajoneuvoja ja pysäköintipaikkoja, voidaan mallintaa esineiksi, kun taas vuorovaikutuksia, kuten pysäköinti, voidaan käsitellä menetelmien avulla. Tämä lähestymistapa edistää modulaarisuuden uudelleenkäytettävyyttä ja ylläpidettävyyttä, mikä tekee järjestelmästä helpon laajentaa ja hallita.

Pysäköintialueen suunnittelu objektilähtöisillä periaatteillaKuinka suunnitella parkkipaikka olioperiaatteella?

Oletukset

Tämänhetkisiä tarkoituksiamme varten teemme seuraavat oletukset. Teimme nämä erityiset oletukset lisätäksemme ongelman hieman monimutkaisuutta lisäämättä liikaa.

  • Parkkipaikalla on useita tasoja. Jokaisella tasolla on useita pisterivejä.
  • Parkkipaikalla voi pysäköidä moottoripyöriä autoja ja busseja.
  • Parkkipaikalla on moottoripyöräpaikkoja kompakteja paikkoja ja suuria paikkoja.
  • Moottoripyörä voi pysäköidä mihin tahansa paikkaan.
  • Auton voi pysäköidä joko yhdelle pienelle tai suurelle paikalle.
  • Bussi voi pysäköidä viidelle suurelle paikalle, jotka ovat peräkkäin ja saman rivin sisällä. Se ei voi pysäköidä pienille paikoille. Alla olevassa toteutuksessa olemme luoneet abstraktin luokan Ajoneuvo, josta Autobussi ja Moottoripyörä perivät.

Olio-suuntautunut suunnittelu

Aloitamme luomalla tarvittavat luokat ja varmistamalla, että jokaisella luokalla on selkeä yksi vastuu. Tarkastellaan suunnittelua keskittymällä siihen, miten kukin luokka ja menetelmä ovat vuorovaikutuksessa.

1. Ajoneuvoluokka

The Vehicle luokka määrittelee yhteiset ominaisuudet ja käyttäytymiset kaikille ajoneuvotyypeille. Se toimii perusluokana tarkemmille ajoneuvotyypeille, kuten Bus Car ja 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. Betoniajoneuvojen luokat

Bussi : Bussi vaatii 5 peräkkäistä suurta paikkaa.

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

Auto : Auto voi pysäköidä joko pienille tai suurille paikoille.

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

Moottoripyörä : Moottoripyörä voi pysäköidä mihin tahansa paikkaan

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

The ParkingSpot luokka edustaa yksittäistä pysäköintipaikkaa parkkipaikalla. Se vastaa sen saatavuuden hallinnasta ja sen tarkistamisesta, mahtuuko tietty ajoneuvo paikalle.

  • Olisimme voineet toteuttaa tämän käyttämällä LargeSpot CompactSpot- ja MotorcycleSpot-luokkia, jotka perivät ParkingSpotilta, mutta tämä on luultavasti liikaa.
  • Täplillä ei todennäköisesti ole muuta käyttäytymistä kuin niiden koko. 
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. Pysäköintitason luokka

The Level luokka edustaa tasoa parkkipaikalla. Se hallinnoi kokoelmaa pysäköintipaikkoja ja tarjoaa tapoja pysäköidä ja poistaa ajoneuvoja.

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. Parkkipaikkaluokka

The ParkingLot luokka edustaa koko parkkipaikkaa. Se hallitsee useita tasoja ja tarjoaa tapoja pysäköidä ja poistaa ajoneuvot parkkipaikalta.

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. Lippu- ja maksupalveluluokat

Lippujen ja maksujen hallintaa varten lisäämme Ticket ja PaymentService luokat.

Lippuluokka : Edustaa lippua, joka myönnetään ajoneuvon pysäköinnin yhteydessä. Se tallentaa ajan, jolloin ajoneuvo saapuu pysäköintialueelle ja poistuu sieltä.

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

Maksupalveluluokka : Vastaa pysäköintimaksun laskemisesta ja maksujen käsittelystä.

Java
   julkinen     luokkaa   Maksupalvelu     {      julkinen     kaksinkertainen     laske Maksu  (  Lippu     lippu  )     {      pitkä     kesto     =     lippu  .  getDuration  ();      // Yksinkertainen maksumalli: `text`=