تعريف الدولة: حالات مختلفة ، سلوكيات مختلفة ؛
متى تستخدم وضع الحالة
يتم استخدام وضع الحالة بشكل أكثر شيوعًا في الاستخدام الفعلي وهو مناسب لـ "تبديل الحالة". نظرًا لأننا نستخدم في كثير من الأحيان إذا كان هناك elseif لتبديل الحالات ، إذا كان هذا الحكم على الدولة يتكرر ، نحتاج إلى التفكير فيما إذا كان بإمكاننا تبني وضع الدولة.
ليس فقط على أساس الحالة ، ولكن أيضا على السمات. إذا كانت خصائص الكائن مختلفة ، فإن سلوك الكائن مختلف. الخصائص ، قد تحدث هذه التغييرات (التبديل) من الخصائص في أي وقت ، لذلك من الممكن استخدام الحالة.
في الاستخدام الفعلي ، هناك العديد من تبديل الحالة على غرار المفاتيح ، ولكن في بعض الأحيان لا يكون الأمر واضحًا ، اعتمادًا على تجربتك وعمق فهم النظام.
ما نريد أن نشرحه هنا هو أن هناك بعض الاختلافات بين "حالة التبديل" و "حكم الدولة العام".
نسخة الكود كما يلي:
إذا (الذي == 1) state = "hello" ؛
آخر إذا (الذي == 2) state = "hi" ؛
آخر إذا (الذي == 3) state = "bye" ؛
هذا هو "حكم الدولة العام". إذا تغيرت إلى:
نسخة الكود كما يلي:
إذا (state.euqals ("bye")) state = "hello" ؛
آخر إذا (state.euqals ("Hello")) state = "hi" ؛
آخر إذا (state.euqals ("hi")) state = "bye" ؛
هذه هي "حالة التبديل" ، وهي تبديل حالة الدولة من "Hello" إلى "مرحبًا" ، ثم إلى "وداعا" ؛ يمكن تغيير حالة الحالة.
إذا قمت ببساطة بتبديل الاتجاه "Hello"-> "مرحبًا"-> "وداعًا"-> "مرحبًا" في ما سبق ، فأنت لا تحتاج بالضرورة إلى استخدام وضع الحالة ، لأن وضع الحالة سيخلق الكثير الفئات الفرعية.
يرجى الاطلاع على المثال التالي:
نسخة الكود كما يلي:
سياق الطبقة العامة {
حالة اللون الخاصة = فارغة ؛
Public Void Push () {
// إذا تم تحويل الحالة الحمراء الحالية إلى اللون الأزرق
if (state == color.red) state = color.blue ؛
// إذا تم تحويل الحالة الزرقاء الحالية إلى اللون الأخضر
آخر إذا (الحالة == color.blue) الحالة = color.green ؛
// إذا تم تحويل الحالة السوداء الحالية إلى اللون الأحمر
آخر إذا (الحالة == color.black) الحالة = color.red ؛
// إذا تم تحويل الحالة الخضراء الحالية إلى الأسود
آخر إذا (الحالة == color.green) الحالة = color.black ؛
عينة عينة = عينة جديدة (حالة) ؛
sample.Operate () ؛
}
Public Void Pull () {
// هو بالضبط عكس التبديل حالة الدفع إذا (الحالة == color.green) الحالة = color.blue ؛
آخر إذا (الحالة == color.black) الحالة = color.green ؛
آخر إذا (الحالة == color.blue) الحالة = color.red ؛
آخر إذا (الحالة == color.red) الحالة = color.black ؛
Sample2 Sample2 = New Sample2 (State) ؛
sample2.Operate () ؛
}
}
في المثال أعلاه ، لدينا إجراءات دفع وسحب.
ملاحظة: ولكن في المثال أعلاه ، يعد تغيير الحالة مجرد سلوك محدد. استخدام.
على سبيل المثال: غالبًا ما تتحول الحسابات المصرفية بين الحالة المفتوحة والدولة القريبة.
على سبيل المثال: لا يمكن إكمال حالة TCPCONCING الكلاسيكية ، حالة الإغلاق والتحويلات المتكررة.
على سبيل المثال: سيحتوي حساب POP على صندوق البريد على أربع ولايات ، وابدأ الإقلاع عن التدخين المعتمدة ، يجب أن يكون السلوك المقابل لكل ولاية كبيرًا نسبيًا ، ومناسب لاستخدام الحالة.
على سبيل المثال: يمكن اعتبار تحديد أدوات مختلفة في صندوق الأدوات التبديل بين أدوات مختلفة ، مناسبة لاستخدام الحالة. على سبيل المثال ، إذا كان لديك برنامج رسم محدد ، فيمكن للمستخدمين اختيار أدوات مختلفة لرسم المنحنى المستقيم.
كيفية استخدام وضع الحالة
تتطلب الدولة نوعين من الكيانات للمشاركة:
1. مدير الدولة هو التبديل.
2. فئة الوالدين التي تنفذها الفئات المجردة أو الواجهات ، ترث حالات مختلفة فئات فرعية مختلفة من هذه الفئة الأصل.
أخذ السياق أعلاه كمثال ، نريد تعديله وإنشاء نوعين من الكيانات.
الخطوة الأولى هي إنشاء فئة الوالدين:
نسخة الكود كما يلي:
الدولة المجردة العامة {
تعابد الفراغ التجريدي العام (السياق ج) ؛
Public Abstract Void Beadpull (Context C) ؛
Public Abstract void getColor () ؛
}
يجب أن تتوافق الأساليب في فئة الوالدين مع سلوك Switch في مدير الحالة. يجب التعامل معها على وجه التحديد.
فيما يلي تطبيقات فئات فرعية محددة:
نسخة الكود كما يلي:
يمتد Bluestate من الطبقة العامة State {
مقابض الفراغ العام (السياق ج) {
// وفقًا لطريقة الدفع "إذا كانت زرقاء ، فقم بالتبديل إلى اللون الأخضر" ؛
C.SetState (New GreenState ()) ؛
}
public void handpull (السياق C) {
// وفقًا لطريقة السحب "إذا كانت زرقاء ، فقم بالتبديل إلى اللون الأحمر" ؛
C.SetState (New RedState ()) ؛
}
public public void getColor () {return (color.blue)}
}
وبالمثل ، يتم تنفيذ الفئات الفرعية في حالات أخرى كأزرق.
الخطوة الثانية هي إعادة كتابة مدير الدولة ، وهو سياق هذا المثال:
نسخة الكود كما يلي:
سياق فئة Ublic {
الدولة الخاصة = NULL ؛
// يستخدم setState لتغيير حالة الحالة باستخدام setState لتحقيق تبديل الحالة
pulic void setState (حالة الحالة) {
this.state = الدولة ؛
}
Public Void Push () {
// تفاصيل تبديل الحالة هي في هذه الحالة تغيير اللون ، والذي تم تغليفه في مقابض الفئة الفرعية ، وليس هناك حاجة لرعاية الحالة.
// لأن العينة تحتاج إلى استخدام نتيجة التبديل ، استخدم getColor ()
عينة عينة = عينة جديدة (state.getColor ()) ؛
sample.Operate () ؛
}
Public Void Pull () {
state.handlepull (هذا) ؛
sample2 sample2 = new sample2 (state.getColor ()) ؛
sample2.Operate () ؛
}
}
في هذه المرحلة ، قمنا بتنفيذ عملية إعادة الطرد للدولة.
ما سبق هو مجرد مثال بسيط إلى حد ما.