Kako načrtovati parkirišče z uporabo objektno usmerjenih načel?

Kako načrtovati parkirišče z uporabo objektno usmerjenih načel?

Oblikovanje parkirišča z uporabo objektno usmerjenih načel vključuje razčlenitev sistema na atribute razredov in metode, ki odražajo entitete iz resničnega sveta. Ključne komponente, kot so vozila in parkirna mesta, je mogoče modelirati kot predmete, medtem ko je interakcije, kot je parkiranje, mogoče obravnavati z metodami. Ta pristop spodbuja možnost ponovne uporabe in vzdrževanja modularnosti, zaradi česar je sistem enostaven za razširitev in upravljanje.

Kako-zasnovati-parkirišče-po-objektno-orientiranih-načelihKako načrtovati parkirišče po objektno usmerjenih principih?

Predpostavke

Za naše namene bomo zdaj naredili naslednje predpostavke. Te posebne predpostavke smo naredili, da bi problemu nekoliko zapletli, ne da bi dodali preveč.

  • Parkirišče ima več nivojev. Vsaka raven ima več vrstic točk.
  • Na parkirišču lahko parkirate motorna kolesa, avtomobile in avtobuse.
  • Parkirišče ima mesta za motorna kolesa, kompaktna mesta in velika mesta.
  • Motorno kolo lahko parkira kjerkoli.
  • Avto lahko parkira bodisi na eno kompaktno mesto bodisi na eno samo veliko mesto.
  • Avtobus lahko parkira na petih velikih mestih, ki so zaporedna in znotraj iste vrste. Ne more parkirati na majhnih mestih. V spodnji izvedbi smo ustvarili abstrakten razred Vozilo, ki ga podedujeta Avtobus in Motorno kolo.

Objektno usmerjeno oblikovanje

Začnemo z ustvarjanjem potrebnih razredov in zagotavljanjem, da ima vsak razred jasno posamezno odgovornost. Razčlenimo zasnovo s poudarkom na medsebojnem delovanju vsakega razreda in metode.

1. Razred vozila

The Vehicle razred opredeljuje skupne lastnosti in vedenja za vse vrste vozil. Služil bo kot osnovni razred za bolj specifične tipe vozil, kot je Bus Car in 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. Razredi betonskih vozil

Avtobus : Avtobus zahteva 5 zaporednih velikih mest.

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

avto : Avto lahko parkira na kompaktnih ali velikih mestih.

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

Motorno kolo : Motorno kolo lahko parkira kjerkoli

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. Razred ParkingSpot

The ParkingSpot razreda predstavlja posamezno parkirno mesto na parkirišču. Odgovoren je za upravljanje njegove razpoložljivosti in preverjanje, ali se določeno vozilo lahko prilega mestu.

  • To bi lahko implementirali z razredoma za LargeSpot CompactSpot in MotorcycleSpot, ki podedujeta ParkingSpot, vendar je to verjetno pretirano.
  • Pege verjetno nimajo drugačnega vedenja razen velikosti. 
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. Razred stopnje parkiranja

The Level razred predstavlja nivo na parkirišču. Upravlja zbirko parkirnih mest in zagotavlja metode za parkiranje in odstranitev vozil.

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. Razred parkirišča

The ParkingLot razreda predstavlja celotno parkirišče. Upravlja več nivojev in zagotavlja metode za parkiranje in odstranjevanje vozil s parkirišča.

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. Razredi vozovnic in plačilnih storitev

Za upravljanje vstopnic in plačil dodamo Ticket in PaymentService razredi.

Razred vozovnice : Predstavlja vozovnico, izdano ob parkiranju vozila. Beleži čas vstopa in izstopa vozila s parkirišča.

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 Class : Odgovoren za obračunavanje parkirnine in obdelavo plačil.

Java
   javnosti     razred   PaymentService     {      javnosti     dvojno     izračunFee  (  Vstopnica     vstopnica  )     {      dolgo     trajanje     =     vstopnica  .  getDuration  ();      // Preprost model pristojbin: `besedilo`=