תבנית המצב בשפת Java

התבנית של המצב היא אחת מתבניות העיצוב ההתנהגותיות. התבנית של המצב משמשת כאשר עצם משנה את התנהגותו בהתבסס על מצבו הפנימי.

התבנית של המצב

אם עלינו לשנות את התנהגותו של עצם על פי המצב שלו, נוכל להשתמש במשתנה מצב בעצם. לאחר מכן נשתמש בבלוק תנאי 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 כדי לממש את דוגמת השלט בטלוויזיה שלנו.

ממשק תבנית עיצוב State

לפני הכל, ניצור ממשק State שיגדיר את השיטה שצריך לממש על ידי מצבים כלליים וכיתה Context. State.java

package com.journaldev.design.state;

public interface State {

	public void doAction();
}

ממשק תבנית עיצוב State – מימושים ספציפיים

בדוגמה שלנו, יכולים להיות שני מצבים – אחד להדלקת הטלוויזיה והשני לכיבוי. אז ניצור שני מימושים ספציפיים למצבים אלו. 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");
	}

}

עכשיו אנו מוכנים לממש את אובייקט ההקשר שלנו שישנה את התנהגותו על פי מצבו הפנימי.

מימוש ההקשר של תבנית העיצוב State

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();
	}

}

שימו לב שההקשר מממש גם את State ושומר על הפניה למצב הנוכחי שלו ומעביר את הבקשה למימוש המצב.

תוכנית בדיקה של תבנית העיצוב State

עכשיו נכתוב תוכנית פשוטה כדי לבדוק את המימוש שלנו של תבנית העיצוב State של השלט של הטלוויזיה. 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();
		
	}

}

פלט של התוכנית לעיל זהה למימוש הבסיסי של השלט של הטלוויזיה ללא שימוש בתבנית העיצוב State.

יתרונות של תבנית העיצוב State

היתרונות של שימוש בתבנית המצב ליישום התנהגות פולימורפית הם ברורים מאוד. יש פחות סיכוי לשגיאות וזה מאוד קל להוסיף עוד מצבים עבור התנהגות נוספת. כתוצאה מכך, הקוד שלנו יותר איכותי, ניתן לתחזוקה קלה יותר וגמיש יותר. גם תבנית המצב עזרה במניעת לוגיקה תנאית if-else או switch-case בסצנריו זה. תבנית המצב דומה מאוד לתבנית האסטרטגיה, ראה תבנית האסטרטגיה ב-Java. זהו כל מה שיש לי לגבי תבנית המצב ב-Java, מקווה שאהבתם את זה.

Source:
https://www.digitalocean.com/community/tutorials/state-design-pattern-java