Navrhovanie parkoviska pomocou objektovo orientovaných princípov zahŕňa rozdelenie systému na atribúty tried a metódy, ktoré odrážajú entity skutočného sveta. Kľúčové komponenty, ako sú vozidlá a parkovacie miesta, môžu byť modelované ako objekty, zatiaľ čo interakcie, ako je parkovanie, môžu byť riešené pomocou metód. Tento prístup podporuje opätovnú použiteľnosť a udržiavateľnosť modulárnosti, vďaka čomu je systém jednoduchý na rozšírenie a správu.
Ako navrhnúť parkovisko pomocou objektovo orientovaných princípov?Predpoklady
Pre naše účely teraz urobíme nasledujúce predpoklady. Urobili sme tieto špecifické predpoklady, aby sme do problému pridali trochu zložitosti bez toho, aby sme pridali príliš veľa.
- Parkovisko má viacero úrovní. Každá úroveň má viacero radov škvŕn.
- Na parkovisku je možné zaparkovať motorky, autá a autobusy.
- Parkovisko má miesta pre motocykle kompaktné miesta a veľké miesta.
- Motocykel môže zaparkovať na akomkoľvek mieste.
- Auto môže zaparkovať na jednom kompaktnom mieste alebo na jednom veľkom mieste.
- Autobus môže zaparkovať na piatich veľkých miestach, ktoré idú za sebou av rovnakom rade. Nemôže parkovať na malých miestach. V nižšie uvedenej implementácii sme vytvorili abstraktnú triedu Vozidlo, z ktorej dedí autobus a motocykel.
Objektovo orientovaný dizajn
Začneme vytvorením potrebných tried a uistením sa, že každá trieda má jasnú jedinú zodpovednosť. Poďme rozobrať dizajn so zameraním na interakciu jednotlivých tried a metód.
1. Trieda vozidla
TheVehicletrieda definuje spoločné atribúty a správanie pre všetky typy vozidiel. Bude slúžiť ako základná trieda pre špecifickejšie typy vozidiel, ako naprBus CaraMotorcycle.
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. Konkrétne triedy vozidiel
Autobus : Autobus vyžaduje 5 po sebe nasledujúcich veľkých miest.
Javapublic class Bus extends Vehicle { public Bus(String licensePlate) { super(licensePlate VehicleSize.Large); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Large; } }
Auto : Auto môže parkovať na kompaktných alebo veľkých miestach.
Javapublic 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; } }
Motocykel : Motocykel môže zaparkovať na akomkoľvek mieste
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. trieda ParkingSpot
TheParkingSpottriedy predstavuje samostatné parkovacie miesto na parkovisku. Je zodpovedný za riadenie jeho dostupnosti a overenie, či sa konkrétne vozidlo zmestí na miesto.
- Mohli sme to implementovať tak, že by sme mali triedy pre LargeSpot CompactSpot a MotorcycleSpot, ktoré dedia od ParkingSpot, ale toto je pravdepodobne prehnané.
- Škvrny pravdepodobne nemajú iné správanie okrem ich veľkosti.
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. Trieda úrovne parkovania
TheLeveltriedy predstavuje úroveň na parkovisku. Spravuje zbierku parkovacích miest a poskytuje spôsoby parkovania a odstraňovania vozidiel.
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. Trieda ParkingLot
TheParkingLottriedy predstavuje celé parkovisko. Spravuje viacero úrovní a poskytuje spôsoby parkovania a odstraňovania vozidiel z parkoviska.
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. Triedy vstupeniek a platobných služieb
Na správu lístkov a platieb pridávameTicketaPaymentServicetriedy.
Trieda lístkov : Predstavuje lístok vydaný pri zaparkovaní vozidla. Zaznamenáva čas vjazdu a výjazdu vozidla z parkoviska.
Javapublic 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 } }
Trieda platobných služieb : Zodpovedá za výpočet parkovného a spracovanie platieb.
Javaverejnosti trieda Platobná služba { verejnosti dvojitý vypočítaťPoplatok(Lístok lístok) { dlhý trvanie = lístok.getDuration(); // Jednoduchý model poplatkov: `text`=