logo

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ä periaatteilla' title=Kuinka 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

TheVehicleluokka määrittelee yhteiset ominaisuudet ja käyttäytymiset kaikille ajoneuvotyypeille. Se toimii perusluokana tarkemmille ajoneuvotyypeille, kutenBus CarjaMotorcycle.

kuinka monta kaupunkia on Yhdysvalloissa
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 merkkijonomuoto pitkä
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

TheParkingSpotluokka 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

TheLevelluokka 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

TheParkingLotluokka 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äämmeTicketjaPaymentServiceluokat.

java system.out.println

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`=