logo

Cum să proiectați o parcare folosind principii orientate pe obiecte?

Proiectarea unei parcări folosind principii orientate pe obiect implică defalcarea sistemului în clase de atribute și metode care reflectă entitățile din lumea reală. Componentele cheie precum vehiculele și locurile de parcare pot fi modelate ca obiecte, în timp ce interacțiunile precum parcarea pot fi gestionate prin metode. Această abordare promovează modularitatea, reutilizarea și mentenabilitatea, făcând sistemul ușor de extins și gestionat.

Cum să-proiectezi-o-parcare-folosind-principii-orientate-obiect' title=Cum să proiectați o parcare folosind principii orientate pe obiecte?

Ipoteze

În scopurile noastre, acum vom face următoarele ipoteze. Am făcut aceste ipoteze specifice pentru a adăuga un pic de complexitate problemei fără a adăuga prea mult.

  • Parcarea are mai multe niveluri. Fiecare nivel are mai multe rânduri de spoturi.
  • Parcarea poate parca motociclete, mașini și autobuze.
  • Parcarea are locuri pentru motociclete locuri compacte și locuri mari.
  • O motocicleta poate parca in orice loc.
  • O mașină poate parca fie într-un singur loc compact, fie într-un singur loc mare.
  • Un autobuz poate parca în cinci locuri mari care sunt consecutive și în același rând. Nu poate parca în locuri mici. În implementarea de mai jos am creat o clasă abstractă Vehicule de la care moștenesc Autobuzul și Motocicleta.

Design orientat pe obiecte

Începem prin a crea clasele necesare și ne asigurăm că fiecare clasă are o responsabilitate unică clară. Să defalcăm designul, concentrându-ne pe modul în care interacționează fiecare clasă și metodă.



1. Clasa de vehicule

TheVehicleclasa definește atribute și comportamente comune pentru toate tipurile de vehicule. Va servi ca o clasă de bază pentru tipuri de vehicule mai specifice, cum ar fiBus CarşiMotorcycle.

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. Clasele de vehicule din beton

Autobuz : Un autobuz necesită 5 locuri mari consecutive.

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

masina : O mașină poate parca fie în locuri compacte, fie în locuri mari.

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

Motocicletă : O motocicletă poate parca în orice loc

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. Clasa ParkSpot

TheParkingSpotclasa reprezintă un loc de parcare individual în parcare. Acesta este responsabil pentru gestionarea disponibilității acestuia și pentru verificarea dacă un anumit vehicul poate încăpea la fața locului.

  • Am fi putut implementa acest lucru având clase pentru LargeSpot CompactSpot și MotorcycleSpot care moștenesc de la ParkingSpot, dar acest lucru este probabil exagerat.
  • Petele probabil nu au comportamente diferite, altele decât dimensiunile lor. 
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. Clasa ParkingLevel

TheLevelclasa reprezintă un nivel în parcare. Gestionează o colecție de locuri de parcare și oferă metode de parcare și de îndepărtare a vehiculelor.

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. Clasa de parcare

TheParkingLotclasa reprezintă întreaga parcare. Gestionează mai multe niveluri și oferă metode de parcare și de îndepărtare a vehiculelor din parcare.

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. Clasele de servicii de plăți și bilete

Pentru a gestiona biletele și plățile, adăugămTicketşiPaymentServiceclasele.

Clasa de bilete : Reprezintă biletul emis la parcarea unui vehicul. Înregistrează ora la care vehiculul intră și iese din parcare.

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

Clasa PaymentService : Responsabil cu calcularea taxei de parcare și procesarea plăților.

Java
public clasă Serviciu de plată {  public dubla calculateFee(Bilet bilet) {  lung durată = bilet.getDuration();  // Model de taxă simplu: `text`=