logo

Jak navrhnout parkoviště pomocí objektově orientovaných principů?

Návrh parkoviště pomocí objektově orientovaných principů zahrnuje rozdělení systému do tříd atributů a metod, které odrážejí entity reálného světa. Klíčové komponenty, jako jsou vozidla a parkovací místa, lze modelovat jako objekty, zatímco interakce, jako je parkování, lze řešit pomocí metod. Tento přístup podporuje opětovnou použitelnost a udržovatelnost modularity, což usnadňuje rozšiřování a správu systému.

Jak-na-projektovat-parkoviště-pomocí-objektově-orientovaných-principů' title=Jak navrhnout parkoviště pomocí objektově orientovaných principů?

Předpoklady

Pro naše účely nyní učiníme následující předpoklady. Udělali jsme tyto konkrétní předpoklady, abychom problém trochu zkomplikovali, aniž bychom přidali příliš mnoho.

  • Parkoviště má několik úrovní. Každá úroveň má několik řad bodů.
  • Na parkovišti je možné zaparkovat motorky, auta a autobusy.
  • Parkoviště má místa pro motocykly kompaktní a velká místa.
  • Motocykl může zaparkovat na jakémkoli místě.
  • Auto může zaparkovat buď na jednom kompaktním místě, nebo na jednom velkém místě.
  • Autobus může zaparkovat na pěti velkých místech, která jdou za sebou a ve stejné řadě. Nemůže parkovat na malých místech. V níže uvedené implementaci jsme vytvořili abstraktní třídu Vehicle, ze které dědí Car Bus a Motocycle.

Objektově orientovaný design

Začneme tím, že vytvoříme potřebné třídy a zajistíme, aby každá třída měla jasnou jedinou odpovědnost. Pojďme si návrh rozebrat se zaměřením na to, jak jednotlivé třídy a metody interagují.



java lambda

1. Třída vozidla

TheVehicletřída definuje společné atributy a chování pro všechny typy vozidel. Bude sloužit jako základní třída pro specifičtější typy vozidel, jako jeBus 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étní třídy vozidel

Autobus : Autobus vyžaduje 5 po sobě jdoucích velkých míst.

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 zaparkovat na kompaktních nebo velkých místech.

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

Motocykl : Motocykl může zaparkovat na jakémkoli místě

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. Třída ParkingSpot

TheParkingSpottřídy představuje samostatné parkovací místo na parkovišti. Je odpovědný za řízení jeho dostupnosti a ověřování, zda se konkrétní vozidlo vejde na místo.

  • Mohli jsme to implementovat tak, že bychom měli třídy pro LargeSpot CompactSpot a MotorcycleSpot, které dědí z ParkingSpot, ale to je pravděpodobně přehnané.
  • Skvrny pravděpodobně nemají jiné chování než jejich velikosti. 
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. Třída úrovně parkování

TheLeveltřídy představuje úroveň na parkovišti. Spravuje sbírku parkovacích míst a poskytuje způsoby, jak zaparkovat a odstranit vozidla.

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. Třída parkoviště

TheParkingLottřídy představuje celé parkoviště. Spravuje více úrovní a poskytuje způsoby, jak zaparkovat a odstranit vozidla z parkoviště.

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. Třídy vstupenek a plateb

Pro správu jízdenek a plateb přidávámeTicketaPaymentServicetřídy.

Třída vstupenek : Představuje lístek vydaný při zaparkování vozidla. Zaznamenává dobu vjezdu a výjezdu vozidla z parkoviště.

centos vs rhel
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  } } 

Třída PaymentService : Zodpovídá za výpočet parkovného a zpracování plateb.

Jáva
veřejnost třída Platební služba {  veřejnost dvojnásobek vypočítatPoplatek(Lístek lístek) {  dlouho trvání = lístek.getDuration();  // Jednoduchý model poplatků: `text`=