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?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.
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.
Javapublic 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 potineniJava
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
Javapublic 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.
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.
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.
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 redeJava
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.
Javapúblico aula Serviço de pagamento { público dobro calcularTaxa(Bilhete bilhete) { longo duração = bilhete.getDuration(); // Modelo de taxa simples: `text`=