עיצוב מגרש חניה באמצעות עקרונות מונחה עצמים כרוך בפירוק המערכת לתכונות ושיטות מחלקות המשקפות ישויות בעולם האמיתי. ניתן לעצב רכיבים מרכזיים כמו כלי רכב ומקומות חניה כאובייקטים בעוד שניתן לטפל באינטראקציות כגון חניה באמצעות שיטות. גישה זו מקדמת שימוש חוזר ותחזוקה מודולריות מה שהופך את המערכת לקלה להרחבה ולניהול.
כיצד לעצב חניה באמצעות עקרונות מכווני עצמים?הנחות
למטרותינו כרגע, נניח את ההנחות הבאות. הנחנו את ההנחות הספציפיות האלה כדי להוסיף קצת מורכבות לבעיה מבלי להוסיף יותר מדי.
- לחניון מספר מפלסים. לכל רמה יש מספר שורות של נקודות.
- החניון יכול להחנות אופנועים מכוניות ואוטובוסים.
- בחניון יש ספוטים לאופנועים ספוטים קומפקטיים וספוטים גדולים.
- אופנוע יכול להחנות בכל מקום.
- מכונית יכולה לחנות במקום קומפקטי בודד או במקום גדול אחד.
- אוטובוס יכול לחנות בחמישה מקומות גדולים שהם עוקבים ובתוך אותה שורה. הוא לא יכול לחנות במקומות קטנים. ביישום שלהלן יצרנו רכב בכיתה אבסטרקטית שממנו יורשים אוטובוס רכב ואופנוע.
עיצוב מונחה עצמים
אנו מתחילים ביצירת השיעורים הדרושים ומבטיחים שלכל כיתה תהיה אחריות יחידה ברורה. בואו נפרק את העיצוב תוך התמקדות באינטראקציה בין כל מחלקה ושיטה.
1. מחלקת רכב
הVehicleמחלקה מגדירה תכונות והתנהגויות נפוצות עבור כל סוגי הרכבים. זה ישמש כמחלקה בסיס לסוגי רכב ספציפיים יותר כמוBus CarוMotorcycle.
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. חוגי בטון לרכב
אוֹטוֹבּוּס : אוטובוס דורש 5 מקומות גדולים רצופים.
Javapublic class Bus extends Vehicle { public Bus(String licensePlate) { super(licensePlate VehicleSize.Large); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Large; } }
מְכוֹנִית : מכונית יכולה לחנות במקומות קומפקטיים או גדולים.
מוצר numpy dotJava
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; } }
אוֹפנוֹעַ : אופנוע יכול לחנות בכל מקום
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
הParkingSpotמחלקה מייצגת מקום חניה בודד בחניון. היא אחראית לניהול זמינותו ולוודא האם רכב ספציפי יכול להתאים במקום.
- יכולנו ליישם את זה על ידי קיום מחלקות עבור LargeSpot CompactSpot ו-MotorcycleSpot שיורשים מ-ParkingSpot אבל זה כנראה מוגזם.
- לכתמים כנראה אין התנהגויות שונות מלבד הגדלים שלהם.
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. כיתה ברמת חנייה
הLevelכיתה מייצגת רמה בחניון. הוא מנהל אוסף של מקומות חניה ומספק שיטות לחנייה והסרה של כלי רכב.
מאגר מידעJava
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הכיתה מייצגת את כל החניון. הוא מנהל מספר רמות ומספק שיטות לחנייה והסרה של כלי רכב מהחניון.
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. שיעורי כרטיסים ושירותי תשלום
כדי לנהל כרטוס ותשלומים אנו מוסיפים אתTicketוPaymentServiceשיעורים.
כיתת כרטיסים : מייצג את הכרטיס שהופק כאשר רכב חונה. הוא מתעד את הזמן שבו הרכב נכנס ויוצא מהחנייה.
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 } }
מחלקת שירותי תשלום : אחראי על חישוב אגרת החניה ועיבוד התשלומים.
Javaפּוּמְבֵּי מַחלָקָה שירות תשלום { פּוּמְבֵּי לְהַכפִּיל לחשב עמלה(כַּרְטִיס כַּרְטִיס) { אָרוֹך מֶשֶׁך = כַּרְטִיס.getDuration(); // מודל עמלות פשוט: `טקסט`=