Návrh parkoviště pomocí objektově orientovaných principů zahrnuje rozdělení systému do tříd atributů a metod, které odrážejí entity reálného světa. Klíčové komponenty, jako jsou vozidla a parkovací místa, lze modelovat jako objekty, zatímco interakce, jako je parkování, lze řešit pomocí metod. Tento přístup podporuje opětovnou použitelnost a udržovatelnost modularity, což usnadňuje rozšiřování a správu systému.
Jak navrhnout parkoviště pomocí objektově orientovaných principů?Předpoklady
Pro naše účely nyní učiníme následující předpoklady. Udělali jsme tyto konkrétní předpoklady, abychom problém trochu zkomplikovali, aniž bychom přidali příliš mnoho.
- Parkoviště má několik úrovní. Každá úroveň má několik řad bodů.
- Na parkovišti je možné zaparkovat motorky, auta a autobusy.
- Parkoviště má místa pro motocykly kompaktní a velká místa.
- Motocykl může zaparkovat na jakémkoli místě.
- Auto může zaparkovat buď na jednom kompaktním místě, nebo na jednom velkém místě.
- Autobus může zaparkovat na pěti velkých místech, která jdou za sebou a ve stejné řadě. Nemůže parkovat na malých místech. V níže uvedené implementaci jsme vytvořili abstraktní třídu Vehicle, ze které dědí Car Bus a Motocycle.
Objektově orientovaný design
Začneme tím, že vytvoříme potřebné třídy a zajistíme, aby každá třída měla jasnou jedinou odpovědnost. Pojďme si návrh rozebrat se zaměřením na to, jak jednotlivé třídy a metody interagují.
java lambda
1. Třída vozidla
TheVehicletřída definuje společné atributy a chování pro všechny typy vozidel. Bude sloužit jako základní třída pro specifičtější typy vozidel, jako jeBus 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étní třídy vozidel
Autobus : Autobus vyžaduje 5 po sobě jdoucích velkých míst.
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 zaparkovat na kompaktních nebo velkých místech.
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; } }
Motocykl : Motocykl může zaparkovat na jakémkoli místě
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. Třída ParkingSpot
TheParkingSpottřídy představuje samostatné parkovací místo na parkovišti. Je odpovědný za řízení jeho dostupnosti a ověřování, zda se konkrétní vozidlo vejde na místo.
- Mohli jsme to implementovat tak, že bychom měli třídy pro LargeSpot CompactSpot a MotorcycleSpot, které dědí z ParkingSpot, ale to je pravděpodobně přehnané.
- Skvrny pravděpodobně nemají jiné chování než jejich velikosti.
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. Třída úrovně parkování
TheLeveltřídy představuje úroveň na parkovišti. Spravuje sbírku parkovacích míst a poskytuje způsoby, jak zaparkovat a odstranit vozidla.
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. Třída parkoviště
TheParkingLottřídy představuje celé parkoviště. Spravuje více úrovní a poskytuje způsoby, jak zaparkovat a odstranit vozidla z parkoviště.
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. Třídy vstupenek a plateb
Pro správu jízdenek a plateb přidávámeTicketaPaymentServicetřídy.
Třída vstupenek : Představuje lístek vydaný při zaparkování vozidla. Zaznamenává dobu vjezdu a výjezdu vozidla z parkoviště.
centos vs rhelJava
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 } }
Třída PaymentService : Zodpovídá za výpočet parkovného a zpracování plateb.
Jávaveřejnost třída Platební služba { veřejnost dvojnásobek vypočítatPoplatek(Lístek lístek) { dlouho trvání = lístek.getDuration(); // Jednoduchý model poplatků: `text`=