Modèle de conception de l’État en Java

Le modèle de conception d’état est l’un des modèles de conception comportementale. Il est utilisé lorsque qu’un objet change son comportement en fonction de son état interne.

Modèle de conception d’état

Si nous devons changer le comportement d’un objet en fonction de son état, nous pouvons avoir une variable d’état dans l’objet. Ensuite, utilisez la structure conditionnelle if-else pour effectuer différentes actions en fonction de l’état. Le modèle de conception d’état est utilisé pour fournir une manière systématique et peu couplée d’atteindre cela grâce aux implémentations de Contexte et État. Le modèle d’état Contexte est la classe qui a une référence d’état vers l’une des implémentations concrètes de l’état. Le contexte transfère la demande à l’objet d’état pour le traitement. Comprendre cela avec un exemple simple. Supposons que nous voulons implémenter une télécommande de télévision avec un simple bouton pour effectuer une action. Si l’état est ACTIF, il allumera la télévision et si l’état est INACTIF, il éteindra la télévision. Nous pouvons l’implémenter en utilisant une structure conditionnelle if-else comme ci-dessous; 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();
	}

}

Remarquez que le code client doit connaître les valeurs spécifiques à utiliser pour définir l’état du dispositif distant. De plus, si le nombre d’états augmente, le couplage étroit entre l’implémentation et le code client sera très difficile à maintenir et à étendre. Nous utiliserons maintenant le modèle de conception State pour implémenter l’exemple ci-dessus de la télécommande.

Interface du Modèle de Conception State

Tout d’abord, nous créerons une interface d’état qui définira la méthode à implémenter par différents états concrets et la classe de contexte. State.java

package com.journaldev.design.state;

public interface State {

	public void doAction();
}

Implémentations d’État Concret du Modèle de Conception State

Dans notre exemple, nous pouvons avoir deux états – l’un pour allumer la télévision et l’autre pour l’éteindre. Nous créerons donc deux implémentations d’état concret pour ces comportements. 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");
	}

}

Nous sommes maintenant prêts à implémenter notre objet de contexte qui changera son comportement en fonction de son état interne.

Implémentation de Contexte de Modèle d’État

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

}

Remarquez que Contexte implémente également État et garde une référence de son état actuel et transmet la demande à l’implémentation de l’état.

Programme de Test de Modèle d’État

Écrivons maintenant un programme simple pour tester notre implémentation du modèle d’état de la télécommande 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();
		
	}

}

La sortie du programme ci-dessus est identique à l’implémentation de base de la télécommande TV sans utiliser le modèle d’état.

Avantages du Modèle d’État

Les avantages de l’utilisation du modèle d’état pour implémenter un comportement polymorphe sont clairement visibles. Les chances d’erreur sont moindres et il est très facile d’ajouter plus d’états pour un comportement supplémentaire. Cela rend donc notre code plus robuste, facilement maintenable et flexible. De plus, le modèle d’état a aidé à éviter la logique conditionnelle if-else ou switch-case dans ce scénario. Le modèle d’état est très similaire au modèle de stratégie, consultez Modèle de stratégie en Java. C’est tout pour le modèle de conception d’état en Java, j’espère que cela vous a plu.

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