logo

Kā izveidot autostāvvietu, izmantojot uz objektu orientētus principus?

Autostāvvietas projektēšana, izmantojot uz objektu orientētus principus, ietver sistēmas sadalīšanu klašu atribūtos un metodēs, kas atspoguļo reālās pasaules entītijas. Galvenās sastāvdaļas, piemēram, transportlīdzekļus un stāvvietas, var modelēt kā objektus, savukārt mijiedarbību, piemēram, autostāvvietu, var apstrādāt, izmantojot metodes. Šī pieeja veicina modularitātes atkārtotu izmantošanu un apkopi, padarot sistēmu viegli paplašināmu un pārvaldāmu.

Kā izveidot autostāvvietu, izmantojot objektu orientētus principus' title=Kā izveidot autostāvvietu, izmantojot objektorientētus principus?

Pieņēmumi

Pašreizējos nolūkos mēs izdarīsim šādus pieņēmumus. Mēs veicām šos īpašos pieņēmumus, lai nedaudz sarežģītu problēmu, nepievienojot to pārāk daudz.

  • Autostāvvietai ir vairāki līmeņi. Katrā līmenī ir vairākas punktu rindas.
  • Autostāvvietā var novietot motociklu automašīnas un autobusus.
  • Autostāvvietā ir motociklu vietas, kompaktas vietas un lielas vietas.
  • Motociklu var novietot jebkurā vietā.
  • Automašīnu var novietot vai nu vienā kompaktā vietā, vai vienā lielā vietā.
  • Autobusu var novietot piecās lielās vietās, kas atrodas pēc kārtas un atrodas vienā rindā. Tas nevar novietot automašīnu mazās vietās. Zemāk esošajā izpildījumā esam izveidojuši abstraktu klasi Transportlīdzeklis, no kura manto Autobuss un Motocikls.

Uz objektu orientēts dizains

Mēs sākam, izveidojot nepieciešamās nodarbības un nodrošinot, ka katrai klasei ir skaidra viena atbildība. Sadalīsim dizainu, koncentrējoties uz katras klases un metodes mijiedarbību.



vesels skaitlis, salīdzinot ar java

1. Transportlīdzekļa klase

TheVehicleklase definē kopīgus atribūtus un uzvedību visu veidu transportlīdzekļiem. Tā kalpos kā bāzes klase specifiskākiem transportlīdzekļu tipiem, piemēramBus CarunMotorcycle.

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. Betona transportlīdzekļu klases

Autobuss : autobusam ir vajadzīgas 5 lielas vietas pēc kārtas.

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

Automašīna : Automašīnu var novietot gan kompaktās, gan lielās vietās.

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

Motocikls : Motociklu var novietot jebkurā vietā

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 klase

TheParkingSpotklase apzīmē individuālu stāvvietu autostāvvietā. Tā ir atbildīga par tā pieejamības pārvaldību un pārbaudi, vai konkrētais transportlīdzeklis var ietilpt attiecīgajā vietā.

veiktspējas pārbaude
  • Mēs būtu varējuši to īstenot, izveidojot LargeSpot CompactSpot un MotorcycleSpot klases, kuras manto no ParkingSpot, taču tas, iespējams, ir pārspīlēts.
  • Plankumiem, iespējams, nav atšķirīgas uzvedības, izņemot to izmērus. 
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. ParkingLevel klase

TheLevelklase pārstāv līmeni autostāvvietā. Tas pārvalda stāvvietu kolekciju un nodrošina transportlīdzekļu novietošanas un noņemšanas metodes.

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. Autostāvvietas klase

TheParkingLotklase pārstāv visu autostāvvietu. Tas pārvalda vairākus līmeņus un nodrošina metodes, kā novietot un izņemt transportlīdzekļus no autostāvvietas.

normālas formas
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. Biļešu un maksājumu pakalpojumu klases

Lai pārvaldītu biļešu iegādi un maksājumus, mēs pievienojamTicketunPaymentServiceklasēm.

Biļešu klase : apzīmē biļeti, kas izsniegta, kad transportlīdzeklis stāv. Tas reģistrē laiku, kad transportlīdzeklis iebrauc stāvvietā un izbrauc no tās.

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

Maksājumu pakalpojumu klase : Atbildīgs par stāvvietas maksas aprēķināšanu un maksājumu apstrādi.

Java
publiski klasē Maksājumu pakalpojums {  publiski dubultā aprēķināt Maksa(Biļete biļete) {  garš ilgums = biļete.getDuration();  // Vienkāršs maksas modelis: `text`=