logo

Kaip suprojektuoti automobilių stovėjimo aikštelę naudojant objektinius principus?

Stovėjimo aikštelės projektavimas naudojant objektinius principus apima sistemos suskirstymą į klasių atributus ir metodus, kurie atspindi realaus pasaulio esybes. Pagrindiniai komponentai, tokie kaip transporto priemonės ir stovėjimo vietos, gali būti modeliuojami kaip objektai, o sąveika, pvz., parkavimas, gali būti tvarkoma naudojant metodus. Šis metodas skatina modulinį pakartotinį naudojimą ir priežiūrą, todėl sistemą lengva išplėsti ir valdyti.

Kaip suprojektuoti automobilių stovėjimo aikštelę, naudojant objektinius principus' title=Kaip suprojektuoti automobilių stovėjimo aikštelę taikant objektinio orientavimo principus?

Prielaidos

Šiuo metu savo tikslams darysime tokias prielaidas. Mes padarėme šias konkrečias prielaidas, kad padidintume problemos sudėtingumą, nepridedant per daug.

  • Automobilių stovėjimo aikštelė yra kelių lygių. Kiekviename lygyje yra kelios taškų eilės.
  • Aikštelėje galima pastatyti motociklus, automobilius ir autobusus.
  • Automobilių stovėjimo aikštelėje yra motociklų vietų, kompaktiškų ir didelių vietų.
  • Motociklas gali stovėti bet kurioje vietoje.
  • Automobilis gali stovėti vienoje kompaktiškoje arba vienoje didelėje vietoje.
  • Autobusas gali stovėti penkiose didelėse vietose, esančiose iš eilės ir toje pačioje eilėje. Jis negali stovėti mažose vietose. Žemiau pateiktame įgyvendinime sukūrėme abstrakčią transporto priemonės klasę, iš kurios paveldi automobilių autobusai ir motociklai.

Objektinis dizainas

Pradedame kurdami reikiamas klases ir užtikrindami, kad kiekviena klasė prisiimtų aiškią atsakomybę. Išskaidykime dizainą, sutelkdami dėmesį į tai, kaip kiekviena klasė ir metodas sąveikauja.



1. Transporto priemonių klasė

TheVehicleklasė apibrėžia bendrus visų tipų transporto priemonių požymius ir elgesį. Tai bus pagrindinė klasė konkretesniems transporto priemonių tipams, pvzBus CarirMotorcycle.

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. Betoninių transporto priemonių klasės

Autobusas : Autobusui reikia 5 iš eilės didelių vietų.

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

Automobilis : Automobilis gali stovėti tiek kompaktiškose, tiek didelėse vietose.

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

Motociklas : Motociklą galima pastatyti bet kurioje vietoje

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 klasė

TheParkingSpotklasė atstovauja individualią parkavimo vietą aikštelėje. Ji yra atsakinga už prieinamumo valdymą ir patikrinimą, ar konkreti transporto priemonė gali tilpti į vietą.

  • Galėjome tai įgyvendinti turėdami LargeSpot CompactSpot ir MotorcycleSpot klases, kurios paveldės iš ParkingSpot, bet tai tikriausiai per daug.
  • Dėmės tikriausiai nesiskiria kitokiu elgesiu, išskyrus jų dydį. 
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 klasė

TheLevelklasė reprezentuoja lygį automobilių stovėjimo aikštelėje. Jis tvarko stovėjimo aikštelių rinkinį ir pateikia metodus, kaip pastatyti ir pašalinti transporto priemones.

dekoduoti base64 javascript
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. Parkavimo aikštelės klasė

TheParkingLotklasė atstovauja visą automobilių stovėjimo aikštelę. Jis valdo kelis lygius ir pateikia metodus, kaip pastatyti ir pašalinti transporto priemones iš stovėjimo aikštelės.

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. Bilietų ir mokėjimo paslaugų klasės

Norėdami valdyti bilietus ir mokėjimus, pridedameTicketirPaymentServiceklases.

Bilietų klasė : reiškia bilietą, išduotą, kai transporto priemonė stovi. Jis fiksuoja laiką, kada transporto priemonė įvažiuoja į stovėjimo aikštelę ir išvažiuoja iš jos.

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

Mokėjimo paslaugų klasė : Atsakingas už automobilių stovėjimo mokesčio apskaičiavimą ir mokėjimų apdorojimą.

Java
viešas klasė Mokėjimo paslauga {  viešas dvigubai apskaičiuoti Mokestį(Bilietas bilietas) {  ilgas trukmės = bilietas.gautiDuration();  // Paprastas mokesčio modelis: `tekstas`=