logo

Како дизајнирати паркиралиште користећи објектно оријентисане принципе?

Дизајнирање паркинга коришћењем објектно оријентисаних принципа укључује разбијање система на класе атрибута и метода које одражавају ентитете из стварног света. Кључне компоненте као што су возила и паркинг простори могу се моделовати као објекти, док се интеракцијама као што је паркирање може управљати методама. Овај приступ промовише могућност поновне употребе модуларности и могућност одржавања, чинећи систем лаким за проширење и управљање.

Принципи како да дизајнирају паркинг-паркинг користећи објектно оријентисане-принципе' title=Како дизајнирати паркинг користећи објектно оријентисане принципе?

Претпоставке

За наше потребе сада ћемо направити следеће претпоставке. Направили смо ове специфичне претпоставке да бисмо додали мало сложености проблему без додавања превише.

хасхмап
  • Паркинг има више нивоа. Сваки ниво има више редова тачака.
  • Паркинг може паркирати мотоцикле аутомобиле и аутобусе.
  • Паркинг има мотоцикл спотове компактне и велике тачке.
  • Мотоцикл се може паркирати на било ком месту.
  • Аутомобил може да се паркира на једном компактном месту или на једном великом месту.
  • Аутобус може паркирати на пет великих места која су узастопна и унутар истог реда. Не може да се паркира на малим местима. У доњој имплементацији креирали смо апстрактну класу Возило од које наслеђују Аутобус и Мотоцикл.

Објектно-оријентисани дизајн

Почињемо стварањем неопходних класа и осигуравањем да свака класа има јасну јединствену одговорност. Хајде да разложимо дизајн са фокусом на то како свака класа и метод интерагују.



1. Класа возила

ТхеVehicleкласа дефинише заједничке атрибуте и понашања за све типове возила. Служиће као основна класа за специфичније типове возила као што суBus Carи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. Класе бетонских возила

Аутобус : За аутобус је потребно 5 узастопних великих места.

инт удвостручити
Java
public class Bus extends Vehicle {  public Bus(String licensePlate) {  super(licensePlate VehicleSize.Large);  }  public boolean canFitInSpot(ParkingSpot spot) {  return spot.getSpotSize() == VehicleSize.Large;  } } 

Ауто : Аутомобил се може паркирати на компактним или великим местима.

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

Мотоцикл : Мотоцикл може да се паркира на било ком месту

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класа представља појединачно паркинг место на паркингу. Он је одговоран за управљање његовом доступношћу и проверу да ли одређено возило може да стане на лицу места.

  • Могли смо ово да имплементирамо тако што смо имали класе за ЛаргеСпот ЦомпацтСпот и МоторцицлеСпот које су наследиле од ПаркингСпот-а, али ово је вероватно претерано.
  • Тачке вероватно немају другачије понашање осим величине. 
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. ПаркингЛевел Цласс

ТхеLevelкласа представља ниво на паркингу. Он управља скупом паркинг места и обезбеђује методе за паркирање и уклањање возила.

тип у јава
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класа представља цео паркинг. Управља више нивоа и пружа методе за паркирање и уклањање возила са паркинга.

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иPaymentServiceкласе.

Тицкет Цласс : Представља карту која се издаје када се возило паркира. Бележи време када возило улази и излази на паркинг.

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

ПаиментСервице Цласс : Одговоран за обрачун накнаде за паркирање и обраду плаћања.

Јава
јавности класе ПаиментСервице {  јавности дупло израчунатиФее(Тицкет карту) {  дуго трајање = карту.гетДуратион();  // Једноставан модел накнаде: `тект`=