Att designa en parkeringsplats med hjälp av objektorienterade principer innebär att dela upp systemet i klassattribut och metoder som återspeglar verkliga enheter. Nyckelkomponenter som fordon och parkeringsplatser kan modelleras som objekt medan interaktioner som parkering kan hanteras med metoder. Detta tillvägagångssätt främjar modulär återanvändbarhet och underhållsbarhet vilket gör systemet enkelt att utöka och hantera.
Hur designar man en parkeringsplats med hjälp av objektorienterade principer?Antaganden
För våra syften just nu kommer vi att göra följande antaganden. Vi gjorde dessa specifika antaganden för att lägga till lite komplexitet till problemet utan att lägga till för mycket.
- Parkeringsplatsen har flera nivåer. Varje nivå har flera rader med fläckar.
- Parkeringsplatsen kan parkera motorcyklar bilar och bussar.
- Parkeringen har motorcykelplatser kompakta fläckar och stora fläckar.
- En motorcykel kan parkera var som helst.
- En bil kan parkera antingen på en enda kompakt plats eller en enda stor plats.
- En buss kan parkera på fem stora platser som är på varandra följande och inom samma rad. Den kan inte parkera på små platser. I implementeringen nedan har vi skapat ett abstrakt klass Fordon som Bilbuss och Motorcykel ärver från.
Objektorienterad design
Vi börjar med att skapa de nödvändiga klasserna och se till att varje klass har ett tydligt ansvar. Låt oss bryta ner designen med fokus på hur varje klass och metod interagerar.
1. Fordonsklass
DeVehicleklass definierar gemensamma attribut och beteenden för alla typer av fordon. Den kommer att fungera som en basklass för mer specifika fordonstyper somBus CarochMotorcycle.
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. Betongfordonsklasser
Buss : En buss kräver 5 på varandra följande stora platser.
Javapublic class Bus extends Vehicle { public Bus(String licensePlate) { super(licensePlate VehicleSize.Large); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Large; } }
Bil : En bil kan parkera på antingen kompakta eller stora platser.
flyta till snöreJava
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; } }
Motorcykel : En motorcykel kan parkera på vilken plats som helst
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 Class
DeParkingSpotklass representerar en enskild parkeringsplats på parkeringsplatsen. Den ansvarar för att hantera dess tillgänglighet och verifiera om ett specifikt fordon kan passa på plats.
- Vi kunde ha implementerat detta genom att ha klasser för LargeSpot CompactSpot och MotorcycleSpot som ärver från ParkingSpot men detta är förmodligen överdrivet.
- Fläckarna har förmodligen inte andra beteenden än deras storlekar.
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. Parkeringsnivå Klass
DeLevelklass representerar en nivå på parkeringsplatsen. Den hanterar en samling parkeringsplatser och tillhandahåller metoder för att parkera och ta bort fordon.
hur uppgraderar jag javaJava
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. Parkeringsplats klass
DeParkingLotklass representerar hela parkeringsplatsen. Den hanterar flera nivåer och tillhandahåller metoder för att parkera och ta bort fordon från parkeringsplatsen.
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. Biljett- och betalningsserviceklasser
För att hantera biljettförsäljning och betalningar lägger vi tillTicketochPaymentServiceklasser.
Biljettklass : Representerar biljetten som utfärdas när ett fordon parkerar. Den registrerar tiden då fordonet går in och ut från parkeringsplatsen.
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 } }
Betaltjänstklass : Ansvarig för att beräkna parkeringsavgiften och hantera betalningar.
Javaoffentlig klass Betalningstjänst { offentlig dubbel beräkna Avgift(Biljett biljett) { lång varaktighet = biljett.getDuration(); // Enkel avgiftsmodell: `text`=