Kā izveidot autostāvvietu, izmantojot uz objektu orientētus principus?

Kā izveidot autostāvvietu, izmantojot uz objektu orientētus principus?

Autostāvvietas projektēšana, izmantojot uz objektu orientētus principus, ietver sistēmas sadalīšanu klašu atribūtos un metodēs, kas atspoguļo reālās pasaules entītijas. Galvenās sastāvdaļas, piemēram, transportlīdzekļus un stāvvietas, var modelēt kā objektus, savukārt mijiedarbību, piemēram, autostāvvietu, var apstrādāt, izmantojot metodes. Šī pieeja veicina modularitātes atkārtotu izmantošanu un apkopi, padarot sistēmu viegli paplašināmu un pārvaldāmu.

Kā izveidot autostāvvietu, izmantojot objektu orientētus principusKā izveidot autostāvvietu, izmantojot objektorientētus principus?

Pieņēmumi

Pašreizējos nolūkos mēs izdarīsim šādus pieņēmumus. Mēs veicām šos īpašos pieņēmumus, lai nedaudz sarežģītu problēmu, nepievienojot to pārāk daudz.

  • Autostāvvietai ir vairāki līmeņi. Katrā līmenī ir vairākas punktu rindas.
  • Autostāvvietā var novietot motociklu automašīnas un autobusus.
  • Autostāvvietā ir motociklu vietas, kompaktas vietas un lielas vietas.
  • Motociklu var novietot jebkurā vietā.
  • Automašīnu var novietot vai nu vienā kompaktā vietā, vai vienā lielā vietā.
  • Autobusu var novietot piecās lielās vietās, kas atrodas pēc kārtas un atrodas vienā rindā. Tas nevar novietot automašīnu mazās vietās. Zemāk esošajā izpildījumā esam izveidojuši abstraktu klasi Transportlīdzeklis, no kura manto Autobuss un Motocikls.

Uz objektu orientēts dizains

Mēs sākam, izveidojot nepieciešamās nodarbības un nodrošinot, ka katrai klasei ir skaidra viena atbildība. Sadalīsim dizainu, koncentrējoties uz katras klases un metodes mijiedarbību.

1. Transportlīdzekļa klase

The Vehicle klase definē kopīgus atribūtus un uzvedību visu veidu transportlīdzekļiem. Tā kalpos kā bāzes klase specifiskākiem transportlīdzekļu tipiem, piemēram Bus Car un 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. Betona transportlīdzekļu klases

Autobuss : autobusam ir vajadzīgas 5 lielas vietas pēc kārtas.

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

Automašīna : Automašīnu var novietot gan kompaktās, gan lielās vietās.

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

Motocikls : Motociklu var novietot jebkurā vietā

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 klase

The ParkingSpot klase apzīmē individuālu stāvvietu autostāvvietā. Tā ir atbildīga par tā pieejamības pārvaldību un pārbaudi, vai konkrētais transportlīdzeklis var ietilpt attiecīgajā vietā.

  • Mēs būtu varējuši to īstenot, izveidojot LargeSpot CompactSpot un MotorcycleSpot klases, kuras manto no ParkingSpot, taču tas, iespējams, ir pārspīlēts.
  • Plankumiem, iespējams, nav atšķirīgas uzvedības, izņemot to izmērus. 
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 klase

The Level klase pārstāv līmeni autostāvvietā. Tas pārvalda stāvvietu kolekciju un nodrošina transportlīdzekļu novietošanas un noņemšanas metodes.

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. Autostāvvietas klase

The ParkingLot klase pārstāv visu autostāvvietu. Tas pārvalda vairākus līmeņus un nodrošina metodes, kā novietot un izņemt transportlīdzekļus no autostāvvietas.

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. Biļešu un maksājumu pakalpojumu klases

Lai pārvaldītu biļešu iegādi un maksājumus, mēs pievienojam Ticket un PaymentService klasēm.

Biļešu klase : apzīmē biļeti, kas izsniegta, kad transportlīdzeklis stāv. Tas reģistrē laiku, kad transportlīdzeklis iebrauc stāvvietā un izbrauc no tās.

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

Maksājumu pakalpojumu klase : Atbildīgs par stāvvietas maksas aprēķināšanu un maksājumu apstrādi.

Java
   publiski     klasē   Maksājumu pakalpojums     {      publiski     dubultā     aprēķināt Maksa  (  Biļete     biļete  )     {      garš     ilgums     =     biļete  .  getDuration  ();      // Vienkāršs maksas modelis: `text`=