logo

كيفية تصميم موقف للسيارات باستخدام المبادئ الموجهة للكائنات؟

يتضمن تصميم ساحة انتظار السيارات باستخدام المبادئ الموجهة للكائنات تقسيم النظام إلى فئات وسمات وأساليب تعكس كيانات العالم الحقيقي. يمكن تصميم المكونات الرئيسية مثل المركبات وأماكن وقوف السيارات كأشياء بينما يمكن التعامل مع التفاعلات مثل مواقف السيارات من خلال الأساليب. يعزز هذا النهج إمكانية إعادة استخدام الوحدات النمطية وقابلية الصيانة مما يجعل النظام سهل التوسيع والإدارة.

كيفية تصميم موقف للسيارات باستخدام المبادئ الموجهة للكائنات' title=كيفية تصميم موقف للسيارات باستخدام المبادئ الموجهة للكائنات؟

الافتراضات

لأغراضنا الآن سوف نقوم بالافتراضات التالية. لقد وضعنا هذه الافتراضات المحددة لإضافة القليل من التعقيد إلى المشكلة دون إضافة الكثير.

  • موقف السيارات له مستويات متعددة. يحتوي كل مستوى على صفوف متعددة من البقع.
  • يمكن لموقف السيارات ركن السيارات والدراجات النارية والحافلات.
  • يحتوي موقف السيارات على أماكن للدراجات النارية وأماكن مدمجة وأماكن كبيرة.
  • يمكن للدراجة النارية الوقوف في أي مكان.
  • يمكن للسيارة ركنها إما في مكان واحد مدمج أو في مكان واحد كبير.
  • يمكن للحافلة الوقوف في خمس أماكن كبيرة متتالية وضمن نفس الصف. لا يمكن ركنها في أماكن صغيرة. في التنفيذ أدناه، قمنا بإنشاء مركبة فئة مجردة ترث منها سيارة الحافلة والدراجة النارية.

التصميم الموجه للكائنات

نبدأ بإنشاء الفئات الضرورية والتأكد من أن كل فئة لديها مسؤولية واحدة واضحة. دعونا نحلل التصميم مع التركيز على كيفية تفاعل كل فئة وطريقة.



1. فئة المركبة

الVehicleتحدد الفئة السمات والسلوكيات المشتركة لجميع أنواع المركبات. سيكون بمثابة فئة أساسية لأنواع المركبات الأكثر تحديدًا مثلBus CarوMotorcycle.

Java
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 أماكن كبيرة متتالية.

Java
public class Bus extends Vehicle {  public Bus(String licensePlate) {  super(licensePlate VehicleSize.Large);  }  public boolean canFitInSpot(ParkingSpot spot) {  return spot.getSpotSize() == VehicleSize.Large;  } } 

سيارة : يمكن للسيارة ركنها في أماكن صغيرة أو كبيرة.

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;  } } 

دراجة نارية : يمكن للدراجة النارية الوقوف في أي مكان

Java
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يمثل الفصل مكانًا فرديًا لوقوف السيارات في ساحة انتظار السيارات. وهي مسؤولة عن إدارة توفرها والتحقق مما إذا كانت مركبة معينة يمكن وضعها في المكان.

  • كان بإمكاننا تنفيذ ذلك من خلال وجود فصول دراسية لـ LargeSpot CompactSpot وMotorcycleSpot التي ترث من ParkingSpot ولكن ربما يكون هذا مبالغًا فيه.
  • ربما لا يكون للبقع سلوكيات مختلفة بخلاف أحجامها. 
Java
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يمثل الفصل ساحة انتظار السيارات بأكملها. إنه يدير مستويات متعددة ويوفر طرقًا لإيقاف المركبات وإزالتها من ساحة انتظار السيارات.

Java
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الطبقات.

فئة التذكرة : يمثل التذكرة الصادرة عند وقوف السيارة. يسجل وقت دخول السيارة وخروجها من موقف السيارات.

Java
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  } } 

فئة خدمة الدفع : مسؤول عن حساب رسوم مواقف السيارات ومعالجة المدفوعات.

جافا
عام فصل خدمة الدفع {  عام مزدوج com.calculateFee(تذكرة تذكرة) {  طويل مدة = تذكرة.getDuration()؛  // نموذج رسوم بسيط: `text`=