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.
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
O Vehicle classe define atributos e comportamentos comuns para todos os tipos de veículos. Servirá como classe base para tipos de veículos mais específicos, como Bus Car e Motorcycle .
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.
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
O ParkingSpot classe 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
O Level classe 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
O ParkingLot classe 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 o Ticket e PaymentService aulas.
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.
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`=