Hur designar man en parkeringsplats med hjälp av objektorienterade principer?

Hur designar man en parkeringsplats med hjälp av objektorienterade principer?

Att designa en parkeringsplats med hjälp av objektorienterade principer innebär att dela upp systemet i klassattribut och metoder som återspeglar verkliga enheter. Nyckelkomponenter som fordon och parkeringsplatser kan modelleras som objekt medan interaktioner som parkering kan hanteras med metoder. Detta tillvägagångssätt främjar modulär återanvändbarhet och underhållsbarhet vilket gör systemet enkelt att utöka och hantera.

Hur-man-designer-en-parkeringsplats-med-objektorienterade-principerHur designar man en parkeringsplats med hjälp av objektorienterade principer?

Antaganden

För våra syften just nu kommer vi att göra följande antaganden. Vi gjorde dessa specifika antaganden för att lägga till lite komplexitet till problemet utan att lägga till för mycket.

  • Parkeringsplatsen har flera nivåer. Varje nivå har flera rader med fläckar.
  • Parkeringsplatsen kan parkera motorcyklar bilar och bussar.
  • Parkeringen har motorcykelplatser kompakta fläckar och stora fläckar.
  • En motorcykel kan parkera var som helst.
  • En bil kan parkera antingen på en enda kompakt plats eller en enda stor plats.
  • En buss kan parkera på fem stora platser som är på varandra följande och inom samma rad. Den kan inte parkera på små platser. I implementeringen nedan har vi skapat ett abstrakt klass Fordon som Bilbuss och Motorcykel ärver från.

Objektorienterad design

Vi börjar med att skapa de nödvändiga klasserna och se till att varje klass har ett tydligt ansvar. Låt oss bryta ner designen med fokus på hur varje klass och metod interagerar.

1. Fordonsklass

De Vehicle klass definierar gemensamma attribut och beteenden för alla typer av fordon. Den kommer att fungera som en basklass för mer specifika fordonstyper som Bus Car och 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. Betongfordonsklasser

Buss : En buss kräver 5 på varandra följande stora platser.

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

Bil : En bil kan parkera på antingen kompakta eller stora platser.

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

Motorcykel : En motorcykel kan parkera på vilken plats som helst

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 Class

De ParkingSpot klass representerar en enskild parkeringsplats på parkeringsplatsen. Den ansvarar för att hantera dess tillgänglighet och verifiera om ett specifikt fordon kan passa på plats.

  • Vi kunde ha implementerat detta genom att ha klasser för LargeSpot CompactSpot och MotorcycleSpot som ärver från ParkingSpot men detta är förmodligen överdrivet.
  • Fläckarna har förmodligen inte andra beteenden än deras storlekar. 
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. Parkeringsnivå Klass

De Level klass representerar en nivå på parkeringsplatsen. Den hanterar en samling parkeringsplatser och tillhandahåller metoder för att parkera och ta bort fordon.

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. Parkeringsplats klass

De ParkingLot klass representerar hela parkeringsplatsen. Den hanterar flera nivåer och tillhandahåller metoder för att parkera och ta bort fordon från parkeringsplatsen.

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. Biljett- och betalningsserviceklasser

För att hantera biljettförsäljning och betalningar lägger vi till Ticket och PaymentService klasser.

Biljettklass : Representerar biljetten som utfärdas när ett fordon parkerar. Den registrerar tiden då fordonet går in och ut från parkeringsplatsen.

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

Betaltjänstklass : Ansvarig för att beräkna parkeringsavgiften och hantera betalningar.

Java
   offentlig     klass   Betalningstjänst     {      offentlig     dubbel     beräkna Avgift  (  Biljett     biljett  )     {      lång     varaktighet     =     biljett  .  getDuration  ();      // Enkel avgiftsmodell: `text`=