logo

Ako navrhnúť parkovisko pomocou objektovo orientovaných princípov?

Navrhovanie parkoviska pomocou objektovo orientovaných princípov zahŕňa rozdelenie systému na atribúty tried a metódy, ktoré odrážajú entity skutočného sveta. Kľúčové komponenty, ako sú vozidlá a parkovacie miesta, môžu byť modelované ako objekty, zatiaľ čo interakcie, ako je parkovanie, môžu byť riešené pomocou metód. Tento prístup podporuje opätovnú použiteľnosť a udržiavateľnosť modulárnosti, vďaka čomu je systém jednoduchý na rozšírenie a správu.

Ako navrhnúť parkovisko pomocou objektovo orientovaných princípov' title=Ako navrhnúť parkovisko pomocou objektovo orientovaných princípov?

Predpoklady

Pre naše účely teraz urobíme nasledujúce predpoklady. Urobili sme tieto špecifické predpoklady, aby sme do problému pridali trochu zložitosti bez toho, aby sme pridali príliš veľa.

  • Parkovisko má viacero úrovní. Každá úroveň má viacero radov škvŕn.
  • Na parkovisku je možné zaparkovať motorky, autá a autobusy.
  • Parkovisko má miesta pre motocykle kompaktné miesta a veľké miesta.
  • Motocykel môže zaparkovať na akomkoľvek mieste.
  • Auto môže zaparkovať na jednom kompaktnom mieste alebo na jednom veľkom mieste.
  • Autobus môže zaparkovať na piatich veľkých miestach, ktoré idú za sebou av rovnakom rade. Nemôže parkovať na malých miestach. V nižšie uvedenej implementácii sme vytvorili abstraktnú triedu Vozidlo, z ktorej dedí autobus a motocykel.

Objektovo orientovaný dizajn

Začneme vytvorením potrebných tried a uistením sa, že každá trieda má jasnú jedinú zodpovednosť. Poďme rozobrať dizajn so zameraním na interakciu jednotlivých tried a metód.



1. Trieda vozidla

TheVehicletrieda definuje spoločné atribúty a správanie pre všetky typy vozidiel. Bude slúžiť ako základná trieda pre špecifickejšie typy vozidiel, ako naprBus CaraMotorcycle.

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. Konkrétne triedy vozidiel

Autobus : Autobus vyžaduje 5 po sebe nasledujúcich veľkých miest.

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 môže parkovať na kompaktných alebo veľkých miestach.

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

Motocykel : Motocykel môže zaparkovať na akomkoľvek mieste

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. trieda ParkingSpot

TheParkingSpottriedy predstavuje samostatné parkovacie miesto na parkovisku. Je zodpovedný za riadenie jeho dostupnosti a overenie, či sa konkrétne vozidlo zmestí na miesto.

  • Mohli sme to implementovať tak, že by sme mali triedy pre LargeSpot CompactSpot a MotorcycleSpot, ktoré dedia od ParkingSpot, ale toto je pravdepodobne prehnané.
  • Škvrny pravdepodobne nemajú iné správanie okrem ich veľkosti. 
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. Trieda úrovne parkovania

TheLeveltriedy predstavuje úroveň na parkovisku. Spravuje zbierku parkovacích miest a poskytuje spôsoby parkovania a odstraňovania vozidiel.

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

TheParkingLottriedy predstavuje celé parkovisko. Spravuje viacero úrovní a poskytuje spôsoby parkovania a odstraňovania vozidiel z parkoviska.

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. Triedy vstupeniek a platobných služieb

Na správu lístkov a platieb pridávameTicketaPaymentServicetriedy.

Trieda lístkov : Predstavuje lístok vydaný pri zaparkovaní vozidla. Zaznamenáva čas vjazdu a výjazdu vozidla z parkoviska.

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

Trieda platobných služieb : Zodpovedá za výpočet parkovného a spracovanie platieb.

Java
verejnosti trieda Platobná služba {  verejnosti dvojitý vypočítaťPoplatok(Lístok lístok) {  dlhý trvanie = lístok.getDuration();  // Jednoduchý model poplatkov: `text`=