من أجل استخدام أنماط الدولة والسياسة بشكل صحيح في تطبيقات Java ، يحتاج المطورون إلى معرفة الفرق بوضوح بين النموذجين. على الرغم من أن هيكل أوضاع الحالة وأوضاع السياسة متشابهة للغاية ، إلا أنها تتبع أيضًا مبدأ الفتح والإغلاق ، مما يمثل "O" لمبدأ التصميم الصلب ، نواياها مختلفة تمامًا. يتمثل نمط السياسة في Java في تغليف مجموعة من الخوارزميات ذات الصلة ، مما يوفر للمتصلين مرونة وقت التشغيل. يمكن للمتصل اختيار خوارزميات مختلفة في وقت التشغيل دون تعديل فئة السياق باستخدام السياسة. تتضمن الأمثلة الكلاسيكية لاستخدام أنماط السياسة تنفيذ خوارزميات التشفير وخوارزميات الضغط وخوارزميات الفرز. من ناحية أخرى ، يستخدم وضع الحالة كائنًا لإظهار سلوكيات مختلفة في حالات مختلفة. الأشياء في العالم الواقعي لها ولايات أيضًا ، وسوف تتصرف بشكل مختلف وفقًا لولاياتهم. على سبيل المثال ، لا يمكن لآلة البيع بيع العناصر إلا في حالة Hascoin. إذا لم تقم بإلغاء العملات المعدنية ، فلن تبيع البضائع. يمكنك الآن رؤية الفرق بين وضع السياسة ووضع الحالة ، والغرض منها مختلف. يساعد وضع الحالة كائن على إدارة حالته ، بينما يتيح وضع السياسة للعملاء اختيار سلوكيات مختلفة. الاختلاف الآخر الذي ليس من السهل رؤيته هو من يقود التغييرات السلوكية. في وضع السياسة ، يتم تعتمد على العميل ، والذي يوفر سياسات مختلفة لمعلومات السياق. في وضع الدولة ، تتم إدارة ترحيل الحالة بواسطة السياق أو كائن الحالة نفسه. وبالمثل ، إذا قمت بتعديل الحالة في كائن الحالة ، فيجب أن تعقد مرجعًا إلى السياق ، مما يعني أنه بالنسبة لآلة البيع ، فيمكنها استدعاء طريقة setState لتعديل حالة السياق الحالية. من ناحية أخرى ، لا يعقد كائن السياسة إشارة إلى السياق ، ويقوم عميله بتمرير السياسة المحددة إلى السياق. أنماط الإستراتيجية وأنماط الدولة هي أسهل أسئلة المقابلة حول أنماط تصميم Java. في هذه المقالة حول أنماط تصميم Java ، سنقدم هذا بالتفصيل. سوف نستكشف أوجه التشابه والاختلاف بين الوضعين ، مما سيساعد على تحسين فهمك للودين.
أوجه التشابه بين وضع الدولة ووضع السياسة:
إذا نظرت إلى الرسوم البيانية لـ UML لأنماط السياسة وأنماط الحالة ، فإنها تبدو متشابهة للغاية. في وضع الحالة ، يسمى الكائن الذي يستخدم كائن الحالة لتغيير السلوك كائن سياق. وبالمثل ، في وضع الإستراتيجية ، فإن الكائن الذي يستخدم كائن الإستراتيجية لتغيير السلوك هو أيضًا كائن سياق. تذكر أن العميل يتفاعل مع كائن السياق. في وضع الحالة ، السياق proxist طريقة دعوة كائن الحالة. الكائن الحالي في السياق هو كائن الحالة المحدد. في وضع السياسة ، يعمل السياق أيضًا على كائن السياسة. يتم تمرير هذا الكائن إما كمعلمة أو يتم توفيره عند إنشاء كائن السياق.
دعونا نلقي نظرة على بعض أوجه التشابه بين هذين أنماط تصميم جافا الأساسية:
من السهل إضافة كل من وضع الدولة ووضع السياسة على حالات أو سياسات جديدة دون التأثير على استخدامهما ، يتبع كل من مبدأ التصميم للفتح والإغلاق ، مما يعني أن التصميم الخاص بك مفتوح للامتدادات وإغلاق التعديلات. في هذين الوضعين ، يتم إغلاق السياق للتعديل ، ويضيف حالة جديدة أو سياسة. لا تحتاج إلى تعديل كائن السياق في حالات أخرى ، أو تحتاج فقط إلى تغييرات صغيرة. مثلما سيكون للكائن السياق في وضع الحالة حالة أولية ، فإن السياق في وضع السياسة عادة ما يكون له سياسة افتراضية.
يلف وضع الحالة سلوكيات مختلفة في طريق كائنات الحالة المختلفة ، في حين أن وضع السياسة يلف سلوكيات مختلفة في طريق كائنات السياسة المختلفة.
يعتمد كلا النموذجين على فئات فرعية محددة لتحقيق سلوك محدد. تمتد كل سياسة محددة من فئة سياسة مجردة ، وكل ولاية هي أيضًا واجهة تستخدم لتمثيل الدول أو فئة فرعية من الفئة المجردة.
مثيل وضع الدولة
الفئة العامة WindowState {Private String StateValue ؛ WindowState العامة (String StateValue) {this.statevalue = stateValue ؛ } السلسلة العامة getStateValue () {return StateValue ؛ } public void setStateValue (String StateValue) {this.statevalue = stateValue ؛ } public void handle () { /** قم بعمليات مختلفة وفقًا لحالات مختلفة ، ثم تبديل الحالة* / if ("window" .equals (stateValue)) {switchwindow () ؛ this.statevalue = "ملء الشاشة" ؛ } آخر إذا ("fullscreen" .equals (stateValue)) {switchfullScreen () ؛ this.statevalue = "window" ؛ }} private void switchwindow () {system.out.println ("switch to window state") ؛ } private void switchfullscreen () {system.out.println ("Switch to Elge Screen State") ؛ }} / *** استخدام الحالة*/ الفئة العامة WindowContext {Private WindowState State ؛ public WindowContext (WindowState State) {this.state = state ؛ } WindowState GetState () {Return State ؛ } public void setState (WindowState State) {this.state = state ؛ } public void switchstate () {this.state.handle () ؛ }} /** الحالة (الحالة) الوضع السلوكي* يغير كل من حالة الكائن وسلوك الكائن* وفقًا للدولة ، قم بتغيير السلوك*/ اختبار الفئة العامة {public static void main (string [] args) {/*** هناك قيمتان فقط في هذا المثال ، والتي يتم التحكم فيها من قبل فئة الحالة نفسها* يمكنك أيضًا التحكم في قيمة الحالة واليد WindowState ("نافذة")) ؛ context.switchstate () ؛ context.switchstate () ؛ context.switchstate () ؛ context.switchstate () ؛ context.switchstate () ؛ context.switchstate () ؛ }}مطبعة
قم بالتبديل إلى حالة النافذة إلى حالة ملء الشاشة إلى حالة النافذة إلى حالة ملء الشاشة
مثال وضع السياسة
/ *** الترويج للمنتج* هذه الفئة هي: Cash Collection*/ Public Interface ICASHSuper {Double AcceptCash (Double Money) ؛ } / ** * مجموعة النقود العادية * Author Stone * */ Public Class CashNormals icashsuper {Override public doublecscash (double money) {return money ؛ }} / ** * يتم جمع النقد في خصومات * Author Stone * */ Public Class CashRebate تنفذ icashsuper {خصم مزدوج خاص ؛ // خصم CashRebate (خصم مزدوج) {this.rebate = الخصم ؛ } Override Public Double ContractCash (Double Money) {Return New BigDecimal (Money * revate / 10) .SetScale (2 ، BigDecimal.Round_Half_up) .doublevalue () ؛ }} / ** * خصم نقدي مع Cash * Author Stone * */ Public ClassReTurn تنفذ icashsuper {private moneycondition ؛ // استرداد النقود الحد الأدنى للمبلغ الخاص بالعائد المزدوج ؛ // مبلغ الإرجاع العام cashReturn (moneycondition double ، returnmoney) {this.moneycondition = moneycondition ؛ this.returnMoney = returnMoney ؛ } Override Public Double ContractCash (Double Money) {// خصم متعدد if (Money> = MoneyCondition) {return Money - Math.Floor (Money/MoneyCondition) * returnMoney ؛ } آخر {إرجاع المال ؛ }}} / *** قم بتنفيذ السلوك المقابل بناءً على فئة السياسة التي تم تمريرها*/ الفئة العامة CashContext {private icashsuper casher ؛ Public CashContext () {} Public CashContext (icashsuper casher) {this.casher = casher ؛ } public void setCasher (icashsuper casher) {this.casher = casher ؛ } // وفقًا لكائن السياسة المحدد ، فإن سلوك الخوارزمية المتمثل في تسميته Double Double ContractCash (Double Money) {return this.casher.acceptcash (money) ؛ }} اختبار الفئة العامة {public static void main (string [] args) {double money = 998 ؛ // السعر الأصلي CashContext CashContext = جديد CashContext (جديد CashNormal ()) ؛ System.out.println ("السعر الأصلي:" + cashContext.acceptCash (Money)) ؛ // الإستراتيجية العامة CashContext.setCasher (New CashRebate (8.5)) ؛ System.out.println ("85 ٪ OFF:" + CashContext.acceptCash (Money)) ؛ // استراتيجية الخصم 85 ٪ قبالة CashContext.setCasher (New CashReturn (300 ، 50)) ؛ System.out.println ("Return 50 If أكثر من 300:" + cashContext.acceptCash (Money)) ؛ // استراتيجية استرداد النقود 50 إذا كان أكثر من 300}}مطبعة
السعر الأصلي: 998.0 85 ٪ خصم: 848.3 خصم 50: 848.0 على 300
الفرق بين وضع السياسة ووضع الحالة
لقد تعلمنا أن النموذجين متشابهان للغاية في الهيكل ، لكنهما لا يزال لديهم أجزاء مختلفة. دعونا نلقي نظرة على بعض الاختلافات الرئيسية بينهما.
هذا هو كل الاختلافات بين أنماط السياسة وأنماط الحالة في جافا. كما قلت ، تبدو متشابهة للغاية في مخططات UML ، كلاهما يتبع مبدأ الفتح والإغلاق والتغليف السلوك. يتم استخدام وضع السياسة لتغليف الخوارزميات أو السياسات. سيتم توفيره إلى كائن السياق كمعلمة أو كائن مزيج في وقت التشغيل ، بينما يتم استخدام وضع الحالة لإدارة ترحيل الحالة.