logo

Kako dizajnirati parkiralište koristeći objektno orijentirana načela?

Projektiranje parkirališta korištenjem objektno orijentiranih principa uključuje rastavljanje sustava na atribute klasa i metode koje odražavaju entitete stvarnog svijeta. Ključne komponente poput vozila i parkirnih mjesta mogu se modelirati kao objekti, dok se interakcijama poput parkiranja može upravljati putem metoda. Ovaj pristup promiče mogućnost ponovne upotrebe modularnosti i lakoću održavanja čineći sustav jednostavnim za proširenje i upravljanje.

java unos
Kako-projektirati-parkiralište-koristeći-objektno-orijentirane-načela' title=Kako projektirati parkiralište koristeći objektno orijentirane principe?

Pretpostavke

Za naše potrebe sada ćemo napraviti sljedeće pretpostavke. Napravili smo ove specifične pretpostavke kako bismo dodali malo složenosti problemu bez dodavanja previše.

  • Parkiralište je višeetažno. Svaka razina ima više redova mjesta.
  • Na parkingu se mogu parkirati motocikli, automobili i autobusi.
  • Parkiralište ima mjesta za motocikle kompaktna mjesta i velika mjesta.
  • Motocikl se može parkirati na bilo kojem mjestu.
  • Automobil se može parkirati ili na jednom kompaktnom mjestu ili na jednom velikom mjestu.
  • Autobus može parkirati na pet velikih mjesta koja su uzastopna i unutar istog reda. Ne može parkirati na malim mjestima. U donjoj implementaciji stvorili smo apstraktnu klasu Vehicle od koje nasljeđuju Car Bus i Motocikl.

Objektno orijentirani dizajn

Počinjemo stvaranjem potrebnih klasa i osiguravanjem da svaka klasa ima jasnu jedinstvenu odgovornost. Razdvojimo dizajn s fokusom na način interakcije svake klase i metode.



1. Klasa vozila

TheVehicleklasa definira zajedničke atribute i ponašanja za sve vrste vozila. Služit će kao osnovna klasa za specifičnije tipove vozila kao što suBus CariMotorcycle.

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. Konkretne klase vozila

Autobus : Autobus zahtijeva 5 uzastopnih velikih mjesta.

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

Automobil : Automobil se može parkirati na kompaktnim ili velikim mjestima.

java brojač
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;  } } 

Motocikl : Motocikl se može parkirati na bilo kojem mjestu

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 Klasa

TheParkingSpotklasa predstavlja pojedinačno parkirno mjesto na parkiralištu. Odgovoran je za upravljanje njegovom dostupnošću i provjeru može li određeno vozilo stati na to mjesto.

  • Mogli smo ovo implementirati tako da imamo klase za LargeSpot CompactSpot i MotorcycleSpot koje nasljeđuju od ParkingSpota, ali ovo je vjerojatno pretjerano.
  • Točke vjerojatno nemaju drugačije ponašanje osim veličine. 
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. Klasa razine parkiranja

TheLevelklasa predstavlja razinu na parkiralištu. Upravlja skupom parkirnih mjesta i pruža metode za parkiranje i uklanjanje vozila.

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 Klasa

TheParkingLotklasa predstavlja cijelo parkiralište. Upravlja s više razina i pruža metode parkiranja i uklanjanja vozila s parkirališta.

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. Klase usluga karata i plaćanja

Za upravljanje ulaznicama i plaćanjima dodajemoTicketiPaymentServiceklase.

Klasa karte : Predstavlja kartu koja se izdaje kada se vozilo parkira. Bilježi vrijeme ulaska i izlaska vozila s parkirališta.

python program za binarno pretraživanje
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  } } 

PaymentService Class : Odgovoran za izračun naknade za parkiranje i obradu plaćanja.

Java
javnost razreda PaymentService {  javnost dvostruko izračunatiNaknada(Ulaznica ulaznica) {  dugo trajanje = ulaznica.getDuration();  // Jednostavni model naknade: `tekst`=