نمط التصميم الحالة هو واحد من أنماط التصميم السلوكية. يتم استخدام نمط تصميم الحالة عندما يتغير كائن سلوكه استنادًا إلى حالته الداخلية.
نمط تصميم الحالة
إذا كان علينا تغيير سلوك كائن بناءً على حالته، يمكننا وضع متغير حالة في الكائن، ثم استخدام كتلة شرطية if-else لتنفيذ إجراءات مختلفة بناءً على الحالة. يتم استخدام نمط تصميم الحالة لتوفير طريقة منهجية ومفصلة لتحقيق هذا من خلال تنفيذات
Context
و State
. يُعتبر نمط الحالة السياق هو الفئة التي تحتوي على مرجع إلى واحدة من تنفيذات الحالة الملموسة. يُعيد السياق الطلب إلى كائن الحالة للمعالجة. دعونا نفهم هذا بمثال بسيط. لنفترض أننا نريد تنفيذ جهاز تحكم عن بعد للتلفزيون مع زر بسيط لتنفيذ الإجراء. إذا كانت الحالة هي تشغيل، فسيقوم بتشغيل التلفزيون وإذا كانت الحالة هي إيقاف، فسيقوم بإيقاف التلفزيون. يمكننا تنفيذه باستخدام كتلة الشرط if-else مثلما يلي؛ TVRemoteBasic.java
package com.journaldev.design.state;
public class TVRemoteBasic {
private String state="";
public void setState(String state){
this.state=state;
}
public void doAction(){
if(state.equalsIgnoreCase("ON")){
System.out.println("TV is turned ON");
}else if(state.equalsIgnoreCase("OFF")){
System.out.println("TV is turned OFF");
}
}
public static void main(String args[]){
TVRemoteBasic remote = new TVRemoteBasic();
remote.setState("ON");
remote.doAction();
remote.setState("OFF");
remote.doAction();
}
}
لاحظ أنه يجب على رمز العميل أن يعرف القيم المحددة لاستخدام حالة الجهاز عن بُعد. علاوة على ذلك، إذا زاد عدد الحالات، فسيكون من الصعب جدًا الحفاظ على الربط القوي بين التنفيذ ورمز العميل وتوسيعه. الآن سنستخدم نمط حالة لتنفيذ مثال جهاز التلفزيون عن بُعد المذكور أعلاه.
واجهة نمط تصميم الحالة
أولاً وقبل كل شيء، سننشئ واجهة الحالة التي ستعرف الطريقة التي يجب تنفيذها بواسطة حالات مختلفة محددة وفئة السياق. State.java
package com.journaldev.design.state;
public interface State {
public void doAction();
}
تنفيذات حالة محددة لنمط تصميم الحالة
في مثالنا، يمكننا أن نكون لدينا حالتين – حالة لتشغيل التلفزيون وحالة أخرى لإيقاف تشغيله. لذا سننشئ تنفيذات حالة محددة لهذه السلوكيات. TVStartState.java
package com.journaldev.design.state;
public class TVStartState implements State {
@Override
public void doAction() {
System.out.println("TV is turned ON");
}
}
TVStopState.java
package com.journaldev.design.state;
public class TVStopState implements State {
@Override
public void doAction() {
System.out.println("TV is turned OFF");
}
}
الآن نحن جاهزون لتنفيذ كائن السياق الذي سيغير سلوكه بناءً على حالته الداخلية.
تنفيذ سياق نمط التصميم الحالة
TVContext.java
package com.journaldev.design.state;
public class TVContext implements State {
private State tvState;
public void setState(State state) {
this.tvState=state;
}
public State getState() {
return this.tvState;
}
@Override
public void doAction() {
this.tvState.doAction();
}
}
لاحظ أن السياق أيضًا ينفذ الحالة ويحتفظ بمرجع لحالته الحالية ويحول الطلب إلى تنفيذ الحالة.
برنامج اختبار نمط تصميم الحالة
الآن دعونا نكتب برنامجًا بسيطًا لاختبار تنفيذ نمط الحالة الخاص بجهاز التحكم عن بعد التلفزيون. TVRemote.java
package com.journaldev.design.state;
public class TVRemote {
public static void main(String[] args) {
TVContext context = new TVContext();
State tvStartState = new TVStartState();
State tvStopState = new TVStopState();
context.setState(tvStartState);
context.doAction();
context.setState(tvStopState);
context.doAction();
}
}
إخراج البرنامج أعلاه هو نفس تنفيذ جهاز التحكم عن بعد التلفزيون الأساسي بدون استخدام نمط الحالة.
فوائد نمط تصميم الحالة
فوائد استخدام نمط الحالة لتنفيذ السلوك المتعدد الشكل واضحة تمامًا. فرص الخطأ أقل ومن السهل جدًا إضافة المزيد من الحالات للسلوك الإضافي. وبالتالي يجعل رمزنا أكثر قوة وسهولة في الصيانة ومرونة. كما ساعد نمط الحالة في تجنب المنطق الشرطي if-else أو switch-case في هذ scenar. النمط الحالي شبيه جدًا بنمط الاستراتيجية ، تحقق نمط الاستراتيجية في جافا. هذا كل شيء عن نمط تصميم الحالة في جافا ، آمل أن يعجبك.
Source:
https://www.digitalocean.com/community/tutorials/state-design-pattern-java