Wie gestaltet man einen Parkplatz nach objektorientierten Prinzipien?

Wie gestaltet man einen Parkplatz nach objektorientierten Prinzipien?

Beim Entwerfen eines Parkplatzes nach objektorientierten Prinzipien muss das System in Klassen, Attribute und Methoden zerlegt werden, die reale Entitäten widerspiegeln. Schlüsselkomponenten wie Fahrzeuge und Parkplätze können als Objekte modelliert werden, während Interaktionen wie das Parken über Methoden abgewickelt werden können. Dieser Ansatz fördert die Modularität, die Wiederverwendbarkeit und die Wartbarkeit, sodass das System einfach zu erweitern und zu verwalten ist.

Wie man einen Parkplatz nach objektorientierten Prinzipien gestaltetWie gestaltet man einen Parkplatz nach objektorientierten Prinzipien?

Annahmen

Für unsere jetzigen Zwecke gehen wir von den folgenden Annahmen aus. Wir haben diese spezifischen Annahmen getroffen, um das Problem etwas komplexer zu gestalten, ohne zu viel hinzuzufügen.

  • Der Parkplatz verfügt über mehrere Ebenen. Jede Ebene verfügt über mehrere Reihen von Punkten.
  • Auf dem Parkplatz können Motorräder, Autos und Busse abgestellt werden.
  • Der Parkplatz verfügt über Motorradstellplätze, Kompaktstellplätze und Großstellplätze.
  • Ein Motorrad kann überall geparkt werden.
  • Ein Auto kann entweder auf einem einzigen kompakten Parkplatz oder auf einem einzigen großen Parkplatz geparkt werden.
  • Ein Bus kann auf fünf großen Stellplätzen hintereinander und in derselben Reihe parken. Es kann nicht an kleinen Stellen geparkt werden. In der folgenden Implementierung haben wir eine abstrakte Klasse Vehicle erstellt, von der Car Bus und Motorcycle erben.

Objektorientiertes Design

Wir beginnen mit der Erstellung der erforderlichen Klassen und stellen sicher, dass jede Klasse eine klare Einzelverantwortung hat. Lassen Sie uns das Design aufschlüsseln und dabei den Schwerpunkt auf die Interaktion der einzelnen Klassen und Methoden legen.

1. Fahrzeugklasse

Der Vehicle Die Klasse definiert gemeinsame Attribute und Verhaltensweisen für alle Fahrzeugtypen. Es dient als Basisklasse für spezifischere Fahrzeugtypen wie z Bus Car Und 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. Konkrete Fahrzeugklassen

Bus : Ein Bus benötigt 5 aufeinanderfolgende große Plätze.

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 : Ein Auto kann sowohl auf kompakten als auch auf großen Parkplätzen parken.

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

Motorrad : Ein Motorrad kann an jedem Ort parken

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

Der ParkingSpot Die Klasse repräsentiert einen einzelnen Parkplatz auf dem Parkplatz. Es ist dafür verantwortlich, die Verfügbarkeit zu verwalten und zu überprüfen, ob ein bestimmtes Fahrzeug an die Stelle passt.

  • Wir hätten dies implementieren können, indem wir Klassen für LargeSpot CompactSpot und MotorcycleSpot hätten, die von ParkingSpot erben, aber das ist wahrscheinlich übertrieben.
  • Abgesehen von ihrer Größe weisen die Flecken wahrscheinlich keine anderen Verhaltensweisen auf. 
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-Klasse

Der Level Die Klasse repräsentiert eine Ebene auf dem Parkplatz. Es verwaltet eine Sammlung von Parkplätzen und bietet Methoden zum Parken und Entfernen von Fahrzeugen.

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. ParkingLot-Klasse

Der ParkingLot Die Klasse repräsentiert den gesamten Parkplatz. Es verwaltet mehrere Ebenen und bietet Methoden zum Parken und Entfernen von Fahrzeugen auf dem Parkplatz.

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. Ticket- und PaymentService-Klassen

Um den Ticketverkauf und die Zahlungen zu verwalten, fügen wir das hinzu Ticket Und PaymentService Klassen.

Ticketklasse : Stellt das Ticket dar, das beim Parken eines Fahrzeugs ausgestellt wird. Es erfasst die Zeit, zu der das Fahrzeug den Parkplatz betritt und verlässt.

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-Klasse : Verantwortlich für die Berechnung der Parkgebühr und die Abwicklung der Zahlungen.

Java
   öffentlich     Klasse   Zahlungsservice     {      öffentlich     doppelt     berechnenGebühr  (  Ticket     Ticket  )     {      lang     Dauer     =     Ticket  .  getDuration  ();      // Einfaches Gebührenmodell: `text`=