Projektiranje parkirališta korištenjem objektno orijentiranih principa uključuje rastavljanje sustava na atribute klasa i metode koje odražavaju entitete stvarnog svijeta. Ključne komponente poput vozila i parkirnih mjesta mogu se modelirati kao objekti, dok se interakcijama poput parkiranja može upravljati putem metoda. Ovaj pristup promiče mogućnost ponovne upotrebe modularnosti i lakoću održavanja čineći sustav jednostavnim za proširenje i upravljanje.
java unos
Kako projektirati parkiralište koristeći objektno orijentirane principe?Pretpostavke
Za naše potrebe sada ćemo napraviti sljedeće pretpostavke. Napravili smo ove specifične pretpostavke kako bismo dodali malo složenosti problemu bez dodavanja previše.
- Parkiralište je višeetažno. Svaka razina ima više redova mjesta.
- Na parkingu se mogu parkirati motocikli, automobili i autobusi.
- Parkiralište ima mjesta za motocikle kompaktna mjesta i velika mjesta.
- Motocikl se može parkirati na bilo kojem mjestu.
- Automobil se može parkirati ili na jednom kompaktnom mjestu ili na jednom velikom mjestu.
- Autobus može parkirati na pet velikih mjesta koja su uzastopna i unutar istog reda. Ne može parkirati na malim mjestima. U donjoj implementaciji stvorili smo apstraktnu klasu Vehicle od koje nasljeđuju Car Bus i Motocikl.
Objektno orijentirani dizajn
Počinjemo stvaranjem potrebnih klasa i osiguravanjem da svaka klasa ima jasnu jedinstvenu odgovornost. Razdvojimo dizajn s fokusom na način interakcije svake klase i metode.
1. Klasa vozila
TheVehicleklasa definira zajedničke atribute i ponašanja za sve vrste vozila. Služit će kao osnovna klasa za specifičnije tipove vozila kao što suBus CariMotorcycle.
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. Konkretne klase vozila
Autobus : Autobus zahtijeva 5 uzastopnih velikih mjesta.
Javapublic class Bus extends Vehicle { public Bus(String licensePlate) { super(licensePlate VehicleSize.Large); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Large; } }
Automobil : Automobil se može parkirati na kompaktnim ili velikim mjestima.
java brojač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; } }
Motocikl : Motocikl se može parkirati na bilo kojem mjestu
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. ParkingSpot Klasa
TheParkingSpotklasa predstavlja pojedinačno parkirno mjesto na parkiralištu. Odgovoran je za upravljanje njegovom dostupnošću i provjeru može li određeno vozilo stati na to mjesto.
- Mogli smo ovo implementirati tako da imamo klase za LargeSpot CompactSpot i MotorcycleSpot koje nasljeđuju od ParkingSpota, ali ovo je vjerojatno pretjerano.
- Točke vjerojatno nemaju drugačije ponašanje osim veličine.
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. Klasa razine parkiranja
TheLevelklasa predstavlja razinu na parkiralištu. Upravlja skupom parkirnih mjesta i pruža metode za parkiranje i uklanjanje vozila.
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. ParkingLot Klasa
TheParkingLotklasa predstavlja cijelo parkiralište. Upravlja s više razina i pruža metode parkiranja i uklanjanja vozila s parkirališta.
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. Klase usluga karata i plaćanja
Za upravljanje ulaznicama i plaćanjima dodajemoTicketiPaymentServiceklase.
Klasa karte : Predstavlja kartu koja se izdaje kada se vozilo parkira. Bilježi vrijeme ulaska i izlaska vozila s parkirališta.
python program za binarno pretraživanjeJava
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 } }
PaymentService Class : Odgovoran za izračun naknade za parkiranje i obradu plaćanja.
Javajavnost razreda PaymentService { javnost dvostruko izračunatiNaknada(Ulaznica ulaznica) { dugo trajanje = ulaznica.getDuration(); // Jednostavni model naknade: `tekst`=