Design Pattern State

NicolasAirault
807 views

Open Source Your Knowledge, Become a Contributor

Technology knowledge has to be shared and made accessible for free. Join the movement.

Create Content

Passons à un exemple

Imaginons que nous souhaitons coder un lecteur vidéo très simple. Ce lecteur pourra uniquement lire une vidéo ou la mettre en pause. Nous voyons donc facilement qu'il n'y que deux états différents possible pour une vidéo dans ce logiciel:

  • Lecture
  • Pause

Evidemment, nous pourrions coder ce programme de cette manière :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Video {
private String etat="";
public void setEtat(String etat){
this.etat=etat;
}
public void action(){
if(etat.equalsIgnoreCase("PLAY")){
System.out.println("La vidéo est en lecture");
}else if(etat.equalsIgnoreCase("PAUSE")){
System.out.println("La vidéo est en pause");
}
}
}
public class Main{
public static void main(String args[]){
Video video = new Video();
video.setEtat("PLAY");
video.action();
video.setEtat("PAUSE");
video.action();
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Maintenant on code ce lecteur à l'aide du pattern State

Tout d'abord on crée une interface nommée EtatVideo de cette forme:

interface EtatVideo {
    void action(Video context);
}

Ensuite on crée nos deux états qui implémente l'interface EtatVideo:

Donc pour lecture on crée VideoEnLecture

class VideoEnLecture implements EtatVideo {

	@Override
	public void action(Video context) {
		System.out.println("La vidéo est en lecture");
		
	}

}

Et pour pause on crée VideoEnPause

class VideoEnPause implements EtatVideo {

	@Override
	public void action(Video context) {
		System.out.println("La vidéo est en pause");	
	}
}

Enfin on crée la classe Video qui va permettre de modifier l'état de la vidéo

class Video {
	private EtatVideo etatVideo;
	
    public void setState(EtatVideo newEtat) {
        this.etatVideo = newEtat;
    }

    public void action() {
    	etatVideo.action(this);
    }
}

On teste maintenant le programme avec les mêmes actions que précedemment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
interface EtatVideo {
void action(Video context);
}
class Video {
private EtatVideo etatVideo;
public void setState(EtatVideo newEtat) {
this.etatVideo = newEtat;
}
public void action() {
etatVideo.action(this);
}
}
class VideoEnPause implements EtatVideo {
@Override
public void action(Video context) {
System.out.println("La vidéo est en pause");
}
}
class VideoEnLecture implements EtatVideo {
@Override
public void action(Video context) {
System.out.println("La vidéo est en lecture");
}
}
public class Main {
public static void main(String[] args) {
Video video = new Video();
video.setState(new VideoEnLecture());
video.action();
video.setState(new VideoEnPause());
video.action();
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

On observe que le résultat est identique. Heureusement!

On obtient le diagramme de classe suivant

Diag_design

Pourquoi utiliser le Design Pattern State

Après avoir testé la méthode classique et celle utilisant le pattern State, on est en droit de se demander quel peut être l'intérêt d'utiliser le pattern State. En effet, il va nécessiter de créer plus de classe et donc d'écrire plus de code pour au final le même résultat.

Et bien le pattern State va permettre au code d'évoluer très facilement!

Si nous décidons d'ajouter une fonctionnalité retour au début de la vidéo, avec la méthode classique, nous devrions rajouter une condition dans la méthode action de la classe Video. Or, avec le design pattern State, nous ne touchons pas au code existant! ** Nous rajoutons simplement la classe RetourAuDebut qui implémente EtatVideo**

Création de la classe RetourAuDebut

Cette classe pourrait se coder ainsi:

class RetourAuDebut implements EtatVideo {

	@Override
	public void action(Video context) {
		System.out.println("Retour au début de la vidéo");
		
	}

}
Open Source Your Knowledge: become a Contributor and help others learn. Create New Content