Modello di progettazione dello stato in Java

Il pattern di progettazione dello stato è uno dei pattern di progettazione comportamentali. Il pattern di progettazione dello stato viene utilizzato quando un oggetto cambia comportamento in base al suo stato interno.

Pattern di Progettazione dello Stato

Se dobbiamo cambiare il comportamento di un oggetto in base al suo stato, possiamo avere una variabile di stato nell’oggetto. Quindi utilizziamo un blocco condizionale if-else per eseguire azioni diverse in base allo stato. Il pattern di progettazione dello stato è utilizzato per fornire un modo sistematico e scarsamente accoppiato per raggiungere questo attraverso le implementazioni di Context e State. Il pattern di progettazione dello stato Context è la classe che ha un riferimento di stato a una delle implementazioni concrete dello stato. Il contesto inoltra la richiesta all’oggetto di stato per l’elaborazione. Capiamo questo con un semplice esempio. Supponiamo di voler implementare un telecomando TV con un semplice pulsante per eseguire un’azione. Se lo stato è ACCESO, accenderà la TV e se lo stato è SPENTO, spegnerà la TV. Possiamo implementarlo utilizzando una condizione if-else come segue; 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();
	}

}

Si noti che il codice client deve conoscere i valori specifici da utilizzare per impostare lo stato del telecomando. Inoltre, se il numero di stati aumenta, il forte accoppiamento tra implementazione e codice client sarà molto difficile da mantenere ed estendere. Ora utilizzeremo il pattern State per implementare l’esempio del telecomando TV.

Interfaccia del pattern di progettazione State

Innanzitutto creeremo un’interfaccia di stato che definirà il metodo che deve essere implementato da diversi stati concreti e dalla classe di contesto. Stato.java

package com.journaldev.design.state;

public interface State {

	public void doAction();
}

Implementazioni di stato concreto del pattern di progettazione State

Nel nostro esempio, possiamo avere due stati: uno per accendere la TV e un altro per spegnerla. Quindi creeremo due implementazioni di stato concreto per questi comportamenti. StatoAvvioTV.java

package com.journaldev.design.state;

public class TVStartState implements State {

	@Override
	public void doAction() {
		System.out.println("TV is turned ON");
	}

}

StatoArrestoTV.java

package com.journaldev.design.state;

public class TVStopState implements State {

	@Override
	public void doAction() {
		System.out.println("TV is turned OFF");
	}

}

Ora siamo pronti per implementare il nostro oggetto Contesto che cambierà il suo comportamento in base al suo stato interno.

Implementazione del Contesto del Modello di Progettazione dello Stato

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

}

Si noti che il Contesto implementa anche lo Stato e mantiene un riferimento al suo stato attuale e inoltra la richiesta all’implementazione dello stato.

Programma di Test del Modello di Progettazione dello Stato

Ora scriviamo un semplice programma per testare la nostra implementazione del modello di progettazione dello stato per il Telecomando TV. 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();
		
	}

}

L’output del programma sopra è lo stesso dell’implementazione di base del Telecomando TV senza utilizzare il modello di progettazione dello stato.

Vantaggi del Modello di Progettazione dello Stato

I benefici dell’uso del pattern State per implementare il comportamento polimorfico sono chiaramente visibili. Le possibilità di errore sono minori ed è molto facile aggiungere più stati per comportamenti aggiuntivi. Ciò rende il nostro codice più robusto, facilmente manutenibile e flessibile. Inoltre, il pattern State ha aiutato ad evitare la logica condizionale if-else o switch-case in questo scenario. Il pattern State è molto simile al pattern Strategy, controlla il pattern Strategy in Java. Questo è tutto per il pattern di progettazione State in Java, spero ti sia piaciuto.

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