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

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

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

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

الافتراضات

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

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

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

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

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`=