logo

Kako načrtovati parkirišče z uporabo objektno usmerjenih načel?

Oblikovanje parkirišča z uporabo objektno usmerjenih načel vključuje razčlenitev sistema na atribute razredov in metode, ki odražajo entitete iz resničnega sveta. Ključne komponente, kot so vozila in parkirna mesta, je mogoče modelirati kot predmete, medtem ko je interakcije, kot je parkiranje, mogoče obravnavati z metodami. Ta pristop spodbuja možnost ponovne uporabe in vzdrževanja modularnosti, zaradi česar je sistem enostaven za razširitev in upravljanje.

Kako-zasnovati-parkirišče-po-objektno-orientiranih-načelih' title=Kako načrtovati parkirišče po objektno usmerjenih principih?

Predpostavke

Za naše namene bomo zdaj naredili naslednje predpostavke. Te posebne predpostavke smo naredili, da bi problemu nekoliko zapletli, ne da bi dodali preveč.

.tif datoteko
  • Parkirišče ima več nivojev. Vsaka raven ima več vrstic točk.
  • Na parkirišču lahko parkirate motorna kolesa, avtomobile in avtobuse.
  • Parkirišče ima mesta za motorna kolesa, kompaktna mesta in velika mesta.
  • Motorno kolo lahko parkira kjerkoli.
  • Avto lahko parkira bodisi na eno kompaktno mesto bodisi na eno samo veliko mesto.
  • Avtobus lahko parkira na petih velikih mestih, ki so zaporedna in znotraj iste vrste. Ne more parkirati na majhnih mestih. V spodnji izvedbi smo ustvarili abstrakten razred Vozilo, ki ga podedujeta Avtobus in Motorno kolo.

Objektno usmerjeno oblikovanje

Začnemo z ustvarjanjem potrebnih razredov in zagotavljanjem, da ima vsak razred jasno posamezno odgovornost. Razčlenimo zasnovo s poudarkom na medsebojnem delovanju vsakega razreda in metode.



1. Razred vozila

TheVehiclerazred opredeljuje skupne lastnosti in vedenja za vse vrste vozil. Služil bo kot osnovni razred za bolj specifične tipe vozil, kot jeBus CarinMotorcycle.

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. Razredi betonskih vozil

Avtobus : Avtobus zahteva 5 zaporednih velikih mest.

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

avto : Avto lahko parkira na kompaktnih ali velikih mestih.

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

Motorno kolo : Motorno kolo lahko parkira kjerkoli

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

TheParkingSpotrazreda predstavlja posamezno parkirno mesto na parkirišču. Odgovoren je za upravljanje njegove razpoložljivosti in preverjanje, ali se določeno vozilo lahko prilega mestu.

  • To bi lahko implementirali z razredoma za LargeSpot CompactSpot in MotorcycleSpot, ki podedujeta ParkingSpot, vendar je to verjetno pretirano.
  • Pege verjetno nimajo drugačnega vedenja razen 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. Razred stopnje parkiranja

TheLevelrazred predstavlja nivo na parkirišču. Upravlja zbirko parkirnih mest in zagotavlja metode za parkiranje in odstranitev vozil.

spajanje razvrščanje v Javi
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. Razred parkirišča

TheParkingLotrazreda predstavlja celotno parkirišče. Upravlja več nivojev in zagotavlja metode za parkiranje in odstranjevanje vozil s parkirišča.

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. Razredi vozovnic in plačilnih storitev

Za upravljanje vstopnic in plačil dodamoTicketinPaymentServicerazredi.

Razred vozovnice : Predstavlja vozovnico, izdano ob parkiranju vozila. Beleži čas vstopa in izstopa vozila s parkirišča.

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 : Odgovoren za obračunavanje parkirnine in obdelavo plačil.

Java
javnosti razred PaymentService {  javnosti dvojno izračunFee(Vstopnica vstopnica) {  dolgo trajanje = vstopnica.getDuration();  // Preprost model pristojbin: `besedilo`=