JavaRush /مدونة جافا /Random-AR /الفرق بين أنماط الدولة والاستراتيجية في جافا
0xFF
مستوى
Донецк

الفرق بين أنماط الدولة والاستراتيجية في جافا

نشرت في المجموعة
من أجل الاستخدام الصحيح لأنماط الحالة والاستراتيجية في تطبيقات Java الأساسية، من المهم لمبرمجي Java أن يفهموا الفرق بينهما بوضوح. على الرغم من أن كلا النموذجين، الدولة والاستراتيجية، لهما بنية مماثلة، وكلاهما يعتمد على مبدأ مفتوح/مغلق، يمثل "O" في مبادئ SOLID ، إلا أنهما مختلفان تمامًا في النية . الفرق بين أنماط الدولة والاستراتيجية في جافا - 1يتم استخدام نمط الإستراتيجية في Java لتغليف مجموعات الخوارزميات ذات الصلة لتوفير مرونة التنفيذ للعميل. يمكن للعميل اختيار أي خوارزمية في وقت التشغيل دون تغيير سياق الفئة التي تستخدم Strategy. بعض الأمثلة الشائعة لنمط الإستراتيجية هي كتابة التعليمات البرمجية التي تستخدم الخوارزميات، مثل التشفير أو الضغط أو الفرز. من ناحية أخرى، يسمح نمط الحالة للكائن بالتصرف بشكل مختلف في حالات مختلفة. لأنه في العالم الحقيقي، غالبًا ما يكون للكائن حالات، ويتصرف بشكل مختلف في حالات مختلفة، على سبيل المثال، آلة البيع تبيع البضائع فقط إذا كانت في الحالة hasCoin، فهي لا تبيع حتى تضع عملة معدنية فيها. الآن يمكنك أن ترى بوضوح الفرق بين أنماط الإستراتيجية والدولة، فهذه نوايا مختلفة. يساعد نمط الحالة الكائن على إدارة الحالة، بينما يسمح نمط الإستراتيجية للعميل باختيار سلوك مختلف. الفرق الآخر الذي ليس من السهل رؤيته هو من يقود التغيير في السلوك. في حالة نمط الإستراتيجية، هذا هو العميل الذي يوفر استراتيجيات مختلفة للسياق؛ في نمط الحالة، يتم التحكم في الانتقال من خلال السياق أو حالة الكائن نفسه. بالإضافة إلى ذلك، إذا كنت تدير تغييرات الحالة في كائن الحالة بنفسك، فيجب أن يكون هناك مرجع للسياق، على سبيل المثال، يجب أن تكون آلة البيع قادرة على استدعاء طريقة setState()لتغيير الحالة الحالية للسياق. من ناحية أخرى، لا يحتوي كائن الإستراتيجية أبدًا على إشارة إلى السياق؛ حيث يقوم العميل نفسه بتمرير الإستراتيجية التي يختارها إلى السياق. يعد الفرق بين أنماط الحالة والاستراتيجية أحد الأسئلة الشائعة في المقابلات حول أنماط Java ، في هذه المقالة حول أنماط Java، سنلقي نظرة فاحصة عليها. سوف نستكشف بعض أوجه التشابه والاختلاف بين أنماط الإستراتيجية والحالة في Java والتي ستساعدك على تحسين فهمك لهذه الأنماط.

أوجه التشابه بين أنماط الدولة والاستراتيجية

إذا نظرت إلى مخطط UML لأنماط الحالة والاستراتيجية، ستلاحظ أن كلاهما يشبه بعضهما البعض. يُعرف الكائن الذي يستخدم الحالة لتغيير سلوكه باسم Context-object، وبالمثل يُشار إلى الكائن الذي يستخدم الإستراتيجية لتغيير سلوكه باسم Context-object. تذكر أن العميل يتفاعل مع Contextالكائن. في حالة نمط الحالة، يقوم السياق بتفويض أساليب الاستدعاء إلى كائن الحالة، والذي يتم الاحتفاظ به باعتباره الكائن الحالي، وفي حالة نمط الإستراتيجية، يستخدم السياق كائن الإستراتيجية كمعلمة أو يتم توفيره أثناء الإنشاء من سياق الكائن. مخطط UML لنمط الحالة في Java الفرق بين أنماط الحالة والاستراتيجية في Java - 2 يصور مخطط UML لنمط الحالة المشكلة الكلاسيكية المتمثلة في إنشاء تصميم آلة بيع موجهة للكائنات في Java. يمكنك أن ترى أن حالة آلة البيع يتم تمثيلها باستخدام واجهة، والتي لديها بعد ذلك تطبيق لتمثيل الحالة المحددة. تحتوي كل حالة أيضًا على إشارات إلى سياق الكائن للانتقال إلى حالة أخرى نتيجة للإجراءات التي يتم استدعاؤها في السياق. مخطط UML لنمط الإستراتيجية في Java الفرق بين أنماط الحالة والاستراتيجية في Java - 3 يحتوي مخطط UML هذا لنمط الإستراتيجية على تطبيقات وظيفية من نوع ما. نظرًا لوجود العديد من خوارزميات الفرز، فإن نمط التصميم هذا يسمح للعميل باختيار خوارزمية عند فرز الكائنات. في الواقع، يستخدم إطار عمل Java Collection هذا النمط لتنفيذ طريقة Collections.sort()تُستخدم لفرز الكائنات في Java. والفرق الوحيد هو أنه بدلاً من السماح للعميل باختيار خوارزمية فرز، فإنه يسمح له بتحديد استراتيجية المقارنة عن طريق تمرير مثيل للواجهة المقارنة أو القابلة للمقارنة إلى Java . دعونا نلقي نظرة على بعض أوجه التشابه بين هذين النمطين الرئيسيين للتصميم في Java:
  1. يسهل كلا النموذجين، الحالة والاستراتيجية، إضافة حالة واستراتيجية جديدتين دون التأثير على سياق الكائن الذي يستخدمهما.

  2. كلاهما يحافظ على الكود الخاص بك وفقًا لمبدأ مفتوح/مغلق ، مما يعني أن التصميم سيكون مفتوحًا للإضافات ولكنه مغلق أمام التعديل. في حالة أنماط الدولة والإستراتيجية، يكون سياق الكائن مغلقًا أمام التعديلات، أو إدخال حالات جديدة أو استراتيجيات جديدة، أو لا تحتاج إلى تعديل سياق الحالة الأخرى، أو الحد الأدنى من التغييرات.

  3. مثلما يبدأ سياق الكائن بحالة تهيئة الكائن في نمط الحالة، فإن سياق الكائن لديه أيضًا إستراتيجية افتراضية في حالة نمط الإستراتيجية في Java.

  4. يمثل نمط الحالة سلوكيات مختلفة في شكل حالات كائن مختلفة، بينما يمثل نمط الإستراتيجية سلوكيات مختلفة في شكل استراتيجيات كائن مختلفة.

  5. يعتمد كلا النموذجين، الإستراتيجية والدولة، على فئات فرعية لتنفيذ السلوك. كل استراتيجية ملموسة تمتد إلى استراتيجية مجردة؛ كل دولة هي فئة فرعية من واجهة أو فئة مجردة تستخدم لتمثيل الدولة.

الاختلافات بين أنماط الإستراتيجية والدولة في Java

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

  2. والفرق التالي بين نمطي الحالة والاستراتيجية هو أن الحالة تغلف حالة الكائن، في حين أن نمط الاستراتيجية يغلف خوارزمية أو استراتيجية. نظرًا لأن الحالة مرتبطة بكائن ما، فلا يمكن إعادة استخدامها، ولكن من خلال فصل الإستراتيجية أو الخوارزمية عن سياقها يمكننا إعادة استخدامها.

  3. في نمط الدولة، قد تحتوي الحالة الشخصية على إشارة إلى السياق لتنفيذ التحولات بين الدول، لكن الاستراتيجية لا تحتوي على إشارة إلى السياق الذي يتم استخدامه فيه.

  4. يمكن تمرير تنفيذ الإستراتيجية كمعلمة إلى الكائن الذي سيستخدمها، على سبيل المثال، تأخذ Collection.sort() مقارنة وهي إستراتيجية. من ناحية أخرى، الحالة هي جزء من سياق الكائن نفسه، وبمرور الوقت ينتقل سياق الكائن من حالة إلى أخرى.

  5. على الرغم من أن كلاً من الاستراتيجية والدولة يتبعان مبدأ مفتوح/مغلق، فإن الإستراتيجية تتبع أيضًا مبدأ المسؤولية الفردية حيث أن كل استراتيجية تحتوي على خوارزمية فردية، والاستراتيجيات المختلفة مستقلة عن بعضها البعض. إن تغيير استراتيجية ما لا يتطلب تغيير استراتيجية أخرى.

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

  7. إن ترتيب تحولات الدولة محدد بشكل جيد في نمط الدولة، ولا يوجد مثل هذا الشرط لنمط الإستراتيجية. العميل حر في اختيار أي تنفيذ للاستراتيجية التي يختارها.

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

  9. الاختلاف الأخير ولكن الأكثر أهمية بين أنماط الحالة والاستراتيجية هو أن التغيير في الإستراتيجية يتم تنفيذه بواسطة العميل، بينما يمكن إجراء التغيير في الحالة من خلال السياق أو حالة الكائن نفسها.

هذا هو كل ما يتعلق بالفرق بين أنماط الدولة والاستراتيجية في Java . كما قلت، يبدو كلاهما متشابهين في فصولهما ومخططات UML، وكلاهما يوفر مبادئ مفتوحة/مغلقة ويغلف السلوك. استخدم نمط الإستراتيجية لتغليف خوارزمية أو إستراتيجية يتم عرضها للسياق في وقت التشغيل، ربما كمعلمة أو كائن مركب، واستخدم نمط الحالة للتحكم في انتقالات الحالة في Java. الأصلي هنا
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION