logo

Como projetar um estacionamento usando princípios orientados a objetos?

Projetar um estacionamento usando princípios orientados a objetos envolve dividir o sistema em classes, atributos e métodos que refletem entidades do mundo real. Componentes principais, como veículos e vagas de estacionamento, podem ser modelados como objetos, enquanto interações como estacionamento podem ser tratadas por meio de métodos. Esta abordagem promove modularidade, reutilização e manutenção, tornando o sistema fácil de estender e gerenciar.

o que é hashset java
Como projetar um estacionamento usando princípios orientados a objetos' title=Como projetar um estacionamento usando princípios orientados a objetos?

Suposições

Para nossos propósitos agora, faremos as seguintes suposições. Fizemos essas suposições específicas para adicionar um pouco de complexidade ao problema, sem acrescentar muito.

  • O estacionamento tem vários níveis. Cada nível possui várias fileiras de pontos.
  • O estacionamento pode estacionar motos, carros e ônibus.
  • O estacionamento possui vagas para motos, vagas compactas e vagas grandes.
  • Uma motocicleta pode estacionar em qualquer lugar.
  • Um carro pode estacionar em uma única vaga compacta ou em uma única vaga grande.
  • Um ônibus pode estacionar em cinco vagas grandes, consecutivas e na mesma fila. Não é possível estacionar em vagas pequenas. Na implementação abaixo, criamos uma classe abstrata Vehicle da qual Car Bus e Motorcycle herdam.

Design Orientado a Objetos

Começamos criando as classes necessárias e garantindo que cada classe tenha uma responsabilidade única e clara. Vamos detalhar o design com foco em como cada classe e método interagem.



1. Classe do veículo

OVehicleclasse define atributos e comportamentos comuns para todos os tipos de veículos. Servirá como classe base para tipos de veículos mais específicos, comoBus CareMotorcycle.

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. Classes de veículos de concreto

Ônibus : Um ônibus requer 5 vagas grandes consecutivas.

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

Carro : Um carro pode estacionar em vagas compactas ou grandes.

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

Motocicleta : Uma motocicleta pode estacionar em qualquer lugar

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

OParkingSpotclasse representa uma vaga de estacionamento individual no estacionamento. É responsável por gerenciar sua disponibilidade e verificar se um determinado veículo cabe na vaga.

  • Poderíamos ter implementado isso tendo classes para LargeSpot CompactSpot e MotorcycleSpot que herdam de ParkingSpot, mas isso provavelmente é um exagero.
  • As manchas provavelmente não apresentam comportamentos diferentes além do tamanho. 
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. Classe ParkingLevel

OLevelclasse representa um nível no estacionamento. Ele gerencia uma coleção de vagas de estacionamento e fornece métodos para estacionar e remover veículos.

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. Classe Estacionamento

OParkingLotclasse representa todo o estacionamento. Ele gerencia vários níveis e fornece métodos para estacionar e retirar veículos do estacionamento.

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. Classes de Ticket e PaymentService

Para gerenciar emissão de bilhetes e pagamentos, adicionamos oTicketePaymentServiceaulas.

Classe de ingresso : Representa o bilhete emitido quando um veículo estaciona. Ele registra o horário em que o veículo entra e sai do estacionamento.

topologia de rede
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  } } 

Classe PaymentService : Responsável pelo cálculo da taxa de estacionamento e processamento de pagamentos.

Java
público aula Serviço de pagamento {  público dobro calcularTaxa(Bilhete bilhete) {  longo duração = bilhete.getDuration();  // Modelo de taxa simples: `text`=