نمط الحالة
نمط الحالة هو نمط تصميم برمجي سلوكي يسمح للكائن بتغيير سلوكه عند تغير حالته الداخلية. هذا النمط قريب من مفهوم آلات الحالة المحدودة . يمكن تفسير نمط الحالة كنمط استراتيجية ، قادر على تغيير الاستراتيجية من خلال استدعاءات للأساليب المُعرَّفة في واجهة النمط.
يُستخدم نمط الحالة في برمجة الحاسوب لتغليف السلوكيات المتغيرة للكائن نفسه ، بناءً على حالته الداخلية. قد تكون هذه طريقةً أنظف لتغيير سلوك الكائن أثناء التشغيل دون اللجوء إلى عبارات شرطية، وبالتالي تحسين قابلية الصيانة. [ 1 ] : 395
ملخص

يُعد نمط تصميم الحالة أحد أنماط التصميم الثلاثة والعشرين التي وثّقتها مجموعة "عصابة الأربعة" والتي تصف كيفية حلّ مشكلات التصميم المتكررة. وتشمل هذه المشكلات تصميم برمجيات كائنية التوجه مرنة وقابلة لإعادة الاستخدام، مثل الكائنات التي يسهل تنفيذها وتغييرها واختبارها وإعادة استخدامها. [ 3 ]
تم تحديد نمط الحالة لحل مشكلتين رئيسيتين: [ 4 ]
- ينبغي أن يغير الكائن سلوكه عندما تتغير حالته الداخلية.
- ينبغي تعريف السلوك الخاص بكل حالة على حدة. أي أن إضافة حالات جديدة لا ينبغي أن تؤثر على سلوك الحالات الموجودة.
يُعدّ تطبيق سلوك خاص بحالة معينة مباشرةً داخل فئة ما أمرًا غير مرن، لأنه يُلزم الفئة بسلوك محدد، ويجعل من المستحيل إضافة حالة جديدة أو تغيير سلوك حالة موجودة لاحقًا، بشكل مستقل عن الفئة، دون تغيير الفئة نفسها. في هذا السياق، يصف النمط حلين:
- عرّف كائنات (حالة) منفصلة تغلف سلوكًا خاصًا بكل حالة. أي، عرّف واجهة (حالة) لتنفيذ سلوك خاص بكل حالة، وعرّف فئات تُنفذ هذه الواجهة لكل حالة.
- تقوم الفئة بتفويض السلوك الخاص بالحالة إلى كائن الحالة الحالي بدلاً من تنفيذ السلوك الخاص بالحالة بشكل مباشر.
هذا يجعل الفئة مستقلة عن كيفية تنفيذ السلوك الخاص بكل حالة. يمكن إضافة حالات جديدة بتعريف فئات حالات جديدة. ويمكن للفئة تغيير سلوكها أثناء التشغيل بتغيير كائن حالتها الحالية.
بناء

في مخطط فئات لغة النمذجة الموحدة (UML) المرفق ، لا تُنفّذ الفئة سلوكًا خاصًا بالحالة بشكل مباشر. بدلاً من ذلك، تشير إلى واجهة تنفيذ السلوك الخاص بالحالة ( )، مما يجعلها مستقلة عن كيفية تنفيذ هذا السلوك. تُنفّذ الفئتان و الواجهة، أي تُنفّذان (تُغلّفان) السلوك الخاص بالحالة لكل حالة. يُظهر مخطط تسلسل UML التفاعلات أثناء التشغيل.ContextContextStatestate.handle()ContextConcreteStateAConcreteStateBState
يُفوّض الكائن Contextسلوكًا خاصًا بالحالة إلى Stateكائنات مختلفة. أولًا، Contextيستدعي handle(this)الكائن الحالي (الابتدائي) الخاص به ConcreteStateA، والذي يُنفّذ العملية ويستدعي الكائن setState(ConcreteStateB)لتغيير Contextالحالة الحالية للسياق إلى الحالة الابتدائية ConcreteStateB. في المرة التالية، Contextيستدعي الكائن مرة أخرى handle(this)الكائن الحالي (الابتدائي ConcreteStateB)، والذي يُنفّذ العملية ويُغيّر الحالة الحالية للسياق إلى الحالة الابتدائية ConcreteStateA.
مثال
هذا مثال بلغة C++ يوضح نمط الحالة.
استيراد std ؛باستخدام std :: unique_ptr ؛// فئة الحالة المجردة FanState { عام : افتراضي void handleButtonPress ( فئة المروحة & مروحة ) ثابت = 0 ؛ افتراضي ~ FanState () = افتراضي ؛ };// فئة السياق Fan { خاص : مؤشر فريد من نوعه <FanState> الحالة الحالية ؛ عام : صريح Fan ( مؤشر فريد من نوعه <FanState> الحالة ) : الحالة الحالية { الحالة } {}void setState ( unique_ptr < FanState > state ) noexcept { currentState = state ; }void pressButton () noexcept { currentState -> handleButtonPress ( * this ); } };// فئة الحالات الملموسة OffState : public FanState { public : void handleButtonPress ( Fan & fan ) const override { std :: println ( "المروحة متوقفة -> جارٍ التبديل إلى السرعة المنخفضة." ); fan . setState ( std :: make_unique < LowSpeedState > ()); } };class LowSpeedState : public FanState { public : void handleButtonPress ( Fan & fan ) const override { std :: println ( "المروحة تعمل بسرعة منخفضة -> جارٍ التبديل إلى السرعة العالية." ); fan . setState ( std :: make_unique < HighSpeedState > ()); } };class HighSpeedState : public FanState { public : void handleButtonPress ( Fan & fan ) const override { std :: println ( "المروحة تعمل بسرعة عالية -> جارٍ إيقاف التشغيل." ); fan . setState ( std :: make_unique < OffState > ()); } };int main () { Fan fan ( std :: unique_ptr < OffState > ());// محاكاة الضغط على الزر عدة مرات fan.pressButton ( ) ; // إيقاف -> منخفض fan.pressButton (); // منخفض -> مرتفع fan.pressButton ( ); // مرتفع -> إيقاف fan.pressButton (); // إيقاف -> منخفضreturn 0 ; }انظر أيضاً
مراجع
- 1 2 إريك غاما ؛ ريتشارد هيلم ؛ رالف جونسون ؛ جون إم. فليسيدس (1995). أنماط التصميم: عناصر البرمجيات القابلة لإعادة الاستخدام والموجهة للكائنات . أديسون-ويسلي . ISBN 0-201-63361-2.
- ↑ "نمط تصميم الدولة - الهيكلة والتعاون" . w3sDesign.com . تم الاطلاع عليه بتاريخ 12 أغسطس 2017 .
- ↑ إريك غاما؛ ريتشارد هيلم؛ رالف جونسون؛ جون فليسيدس (1994). أنماط التصميم: عناصر البرمجيات القابلة لإعادة الاستخدام والموجهة للكائنات . أديسون ويسلي. ص 305 وما بعدها . ISBN 0-201-63361-2.
- ↑ "نمط تصميم الحالة - المشكلة والحل والتطبيق" . w3sDesign.com . تم الاطلاع عليه بتاريخ 12 أغسطس 2017 .
- أنماط تصميم البرمجيات
