A parkoló objektum-orientált elvek használatával történő tervezése magában foglalja a rendszer lebontását osztályattribútumokra és módszerekre, amelyek a való világ entitásait tükrözik. A kulcsfontosságú komponensek, mint például a járművek és a parkolóhelyek objektumként modellezhetők, míg az interakciók, például a parkolás, módszerekkel kezelhetők. Ez a megközelítés elősegíti a moduláris újrafelhasználhatóságot és karbantarthatóságot, így a rendszer könnyen bővíthető és kezelhető.
Hogyan tervezzünk parkolót objektumorientált elvek alapján?Feltételezések
Jelenlegi céljaink érdekében a következő feltételezéseket tesszük. Ezeket a konkrét feltételezéseket azért tettük, hogy egy kicsit bonyolultabbá tegyük a problémát anélkül, hogy túl sokat tennénk hozzá.
- A parkoló több szintes. Minden szinten több sor folt található.
- A parkolóban motorkerékpárok, autók és buszok is beállhatnak.
- A parkolóban motoros helyek, kompakt helyek és nagy helyek találhatók.
- Egy motorkerékpár bárhol parkolhat.
- Egy autó egyetlen kompakt vagy egyetlen nagy helyen is parkolhat.
- Egy autóbusz öt nagy, egymást követő és ugyanazon a sorban lévő helyen tud parkolni. Kis helyen nem tud parkolni. Az alábbi megvalósításban létrehoztunk egy absztrakt járműosztályt, amelyből az autóbusz és a motorkerékpár örököl.
Objektum-orientált tervezés
Kezdjük a szükséges osztályok létrehozásával, és biztosítjuk, hogy minden osztálynak egyértelmű egyetlen felelőssége legyen. Bontsuk fel a tervezést, összpontosítva arra, hogy az egyes osztályok és módszerek hogyan hatnak egymásra.
1. Járműosztály
AVehicleosztály meghatározza az összes járműtípus közös jellemzőit és viselkedését. Alaposztályként szolgál majd a speciálisabb járműtípusokhoz, mint plBus CarésMotorcycle.
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. Betonjármű osztályok
Busz : Egy buszhoz 5 egymást követő nagy hely szükséges.
Javapublic class Bus extends Vehicle { public Bus(String licensePlate) { super(licensePlate VehicleSize.Large); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Large; } }
Autó : Egy autó kompakt vagy nagy helyen is parkolhat.
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; } }
Motorkerékpár : Egy motorkerékpár bárhol parkolhat
tavaszi csizmaJava
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. ParkingSpot osztály
AParkingSpotosztály egyéni parkolóhelyet jelent a parkolóban. Feladata a rendelkezésre állás kezelése és annak ellenőrzése, hogy egy adott jármű elfér-e a helyszínen.
- Megvalósíthattuk volna ezt a LargeSpot CompactSpot és MotorcycleSpot osztályokkal, amelyek a ParkingSpottól öröklik, de ez valószínűleg túlzás.
- A foltok valószínűleg a méretükön kívül más viselkedést mutatnak.
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. Parkolási szintű osztály
ALevelosztály szintet képvisel a parkolóban. Parkolóhelyek gyűjteményét kezeli, és módszereket biztosít a járművek parkolására és eltávolítására.
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. Parkoló osztály
AParkingLotosztály a teljes parkolót képviseli. Több szintet kezel, és módszereket biztosít a járművek parkolására és a parkolóból való eltávolítására.
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. Jegy- és fizetési szolgáltatás osztályok
A jegyértékesítés és a fizetések kezeléséhez hozzáadjuk aTicketésPaymentServiceosztályok.
Jegyosztály : A jármű parkolásakor kiállított jegyet jelöli. Rögzíti azt az időt, amikor a jármű be- és kiszáll a parkolóba.
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 } }
Fizetési szolgáltatás osztály : Felelős a parkolási díj kiszámításáért és a befizetések lebonyolításáért.
Jávanyilvános osztály Fizetési Szolgáltatás { nyilvános kettős Díj kiszámítása(Jegy jegy) { hosszú időtartama = jegy.getDuration(); // Egyszerű díjmodell: `text`=