1. نظرة عامة
عندما يكون هناك حالات متعددة لكائن في النظام ، يمكن تحويل الحالة بينهما ، ويتصرف الكائن بشكل مختلف في حالات مختلفة. يفصل وضع الحالة عن حالة الكائن عن الكائن ويغلفه في فئة حالة خاصة ، بحيث يمكن تغيير حالة الكائن بمرونة. وضع الحالة هو الوضع السلوكي للكائن.
2. السيناريوهات المطبقة
تستخدم لحل مشكلة التغليف لتحولات الحالة المتعددة للكائنات المعقدة في النظام والسلوكيات تحت حالات مختلفة. ببساطة ، هو التعامل مع حالات متعددة من الكائنات وتحويلاتها المتبادلة.
ثالثا. مخطط فئة UML
4. المشاركين
1) ، AbstractState (فئة الحالة التجريدية):
تحدد فئة الحالة التجريدية طرق السلوك التجريدي في ظل حالات مختلفة ، ويتم تنفيذ العمليات السلوكية المختلفة في الفئات الفرعية (فئات فرعية مختلفة).
2) concretestate (الفئة الفرعية الحالة التي تنفذ السلوك في حالات محددة):
فئات فرعية من فئات الحالة التجريدية ، كل فئة فرعية تنفذ سلوكًا يتعلق بحالة فئة البيئة (السياق). كل فئة من الفئة المحددة تتوافق مع حالة محددة من البيئة ، وسلوك حالات محددة مختلفة مختلفة.
3) السياق (فئة البيئة التي تمتلك كائنات الدولة):
وجود سمات الدولة ، بسبب تنوع البيئة ، يمكن أن يكون لها حالات مختلفة وتتصرف بشكل مختلف في ظل حالات مختلفة. الحفاظ على مثيل حالة مجردة في فئة البيئة. يحدد هذه الحالة حالة البيئة الحالية (SetState ()) ، ويفصل سلوك الحالة المحدد ويتم الانتهاء منه بواسطة فئات فرعية مختلفة للحالة.
5. استخدم التعلم في الحالة
1. فئة الدولة التجريدية: state.java
/ *** وضع الحالة لنمط تصميم Java* مجردة فئة الحالة* Author [email protected]**/ حالة الفئة المجردة العامة {/ *** طريقة ملخص سلوك الحالة ، تنفذ الفئة الفرعية المحددة للسلوك مختلف السلوك*/ السلوك التجريدي الجمهور () ؛ }
2. فئة فرعية محددة A: concretestatea.java
/ ** * الفئة الفرعية المحددة في الحالة الفرعية A * Auuthor [email protected] */ Clus Concretestatea يمتد State {Override Public Void السلوك () {// السلوك التجاري للدولة A ، وما الذي يمكن أن يفعله عندما يكون ذلك في هذه الحالة // على سبيل المثال: الهاتف المحمول لا يمكنه إجراء المكالمات بشكل طبيعي عندما لا يكون ذلك مستحقًا للدفعة. قسط")؛ }}
3. فئة فرعية محددة ب: concretestateb.java
/ ** * فئة فرعية محددة من الفئة الفرعية B * Author [email protected] * */ concretestateb من الفئة العامة يمتد الحالة {Override public void السلوك () {// Business Business of State B ، وما الذي يمكن أن يفعله عندما يكون ذلك في هذا الحالة // على سبيل المثال: عندما يكون الهاتف المحمول في وقت التسجيل والوقت. المكالمات ") ؛ }}
4. فئة البيئة مع كائنات الحالة: context.java
/** * بيئة/فئة السياق <br/> * يحتوي على كائن حالة ، ويمكنه إكمال الانتقال بين الحالات [يتم تنفيذ تغييرات الحالة/التبديل في فئة البيئة] * Author [email protected] * */سياق الطبقة العامة {// الحفاظ على مرجع إلى حالة كائن مجردة خاصة بالدولة ؛ ) /*** وظيفة معالجة البيئة ، فإن استدعاء سلوك مثيل الحالة يكمل منطق العمل <br/>* الإشارات إلى سلوكيات مختلفة في حالات مختلفة*/public void handle () {checkState () ؛ state.behavior () ؛ }/*** تحقق من حالة البيئة: يتم تنفيذ تغييرات الحالة/التبديل في فئة البيئة*/private void checkState () {if (bill> = 0.00) {setState (concretestatea () جديد) ؛ } آخر {setState (concretestateB () جديد) ؛ }}/** * اضبط حالة البيئة <br/> * طريقة خاصة ، والغرض من ذلك هو السماح لحالة البيئة بالتحكم/التبديل بواسطة بيئة النظام نفسها ، ولا يحتاج المستخدمون الخارجيون إلى الاهتمام بالدولة داخل البيئة * state */private void setstate (حالة الحالة) {this.state = state ؛ } public double getBill () {return Bill ؛ } public void setbill (double bill) {this.bill = bill ؛ }}
5. اختبار فئة الاتصال العميل: client.java
عميل الفئة العامة {public static void main (string [] args) {context context = new Context () ؛ context.setBill (5.50) ؛ System.out.println ("رصيد رسوم الاتصال الحالي:" + context.getBill () + "$") ؛ context.handle () ؛ context.setBill (-1.50) ؛ System.out.println ("رصيد رسوم الاتصال الحالي:" + context.getBill () + "$") ؛ context.handle () ؛ context.setBill (50.00) ؛ System.out.println ("رصيد رسوم الاتصال الحالي:" + context.getBill () + "$") ؛ context.handle () ؛ }} 6. نتائج تشغيل البرنامج:
رصيد رسوم المكالمات الحالي: 5.5 $
يمكن إجراء رصيد فاتورة الهاتف الحالي بشكل طبيعي عندما لا يكون الهاتف منخفضًا بسبب الدفعة المقدمة: -1.5 دولار
لا يُسمح برصيد رسوم الهاتف الحالي بإجراء مكالمات عندما يكون الهاتف خارج الخدمة.
يمكن للهاتف إجراء مكالمات بشكل طبيعي دون أي دفعة مقدمة
السادس. يوسع
هناك تطبيقان مختلفان لتبديل الحالة في وضع الدولة
الطريقة 1: يتم تنفيذ تغيير/تبديل الحالة في فئة البيئة. كما في رمز حالة الاستخدام أعلاه ، طريقة CheckState () في فئة السياق.
/*** تحقق من حالة البيئة: يتم تنفيذ تغييرات الحالة/التبديل في فئة البيئة*/private void checkState () {if (bill> = 0.00) {setState (concretestatea () جديد) ؛ } آخر {setState (concretestateB () جديد) ؛ }} الطريقة 2: يتم تنفيذ تغيير/تبديل الحالة في فئة فرعية محددة.
خطوات التنفيذ هي كما يلي:
1) تهيئة كائن مثيل الحالة في فئة سياق فئة البيئة ، وقم بتمرير كائن سياق البيئة كمعلمة مُنشأة لحالة الفئة الفرعية إلى مثيل الفئة الفرعية المحددة.
على سبيل المثال ، في فئة Context.java
// قم بتعيين الحالة الأولية this.state = concretestatea جديدة (هذا) ؛
2) في فئة حالة الفئة الفرعية المحددة ، وفقًا لكائن السياق الذي تم إنشاؤه ، يحكم منطق العمل على الوضع من خلال استدعاء قيمة الممتلكات لكائن السياق.
على سبيل المثال ، في فئة concretestatea.java ، الفئة الفرعية للدولة المحددة:
/ ** * فئة فرعية محددة A * Author [email protected] */ Class Class Concretestatea يمتد State {Private Context Ctx ؛ concretestatea (سياق السياق) {ctx = context ؛ } Override public void السلوك () {// السلوك التجاري للدولة A ، وما الذي يمكن أن يفعله عندما يكون في هذه الحالة // على سبيل المثال: يمكن للهاتف المحمول إجراء مكالمات بشكل طبيعي عندما لا يكون ذلك بسبب نظام الدفع المقدم. CheckState () ؛ }/** * تحقق مما إذا كانت الحالة تحتاج إلى تحويل <br/> * يتم تنفيذ تبديل الحالة في الفئة الفرعية المحددة */private void checkState () {if (ctx.getBill () <0.00) {ctx.setState (concretestateb (ctx)) ؛ }}}
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.