Introduction


Le pattern (patron) état est l’un des patterns comportementaux introduit dans le célèbre GOF « Design patterns » il permet de contrôler la communication entre les différents objets, c’est-à-dire permet à un objet de modifier son comportement suite a un changement en son sein. Et permet également la maintenabilité dans le temps de votre programme.

 

“The state pattern is a behavioral software design pattern that implements a state pattern in an object-oriented way.

With the state pattern, a state machine is implemented by implementing each individual state as

a derived class of the state pattern interface, and implementing state transitions by invoking

methods defined by the pattern’s superclass.” Source Wikipedia

L’utilisation de ce pattern nous permettra surtout de ne pas abuser des instructions conditionnelles telles que : if et switch, en nous permettant de supprimer ou d’ajouter un état de transition à n’importe quel moment dans notre programme.

Pour mettre en pratique ce pattern, on développera un petit jeu de tennis simpliste, et on suppose dans toute la suite de cet article que nous connaissons tous les règles de jeu, si ce n’est pas votre cas, veuillez consulter les règles sur cette page wiki.

En général la mise en place de ce pattern nécessite l’implémentation de certaines classes de base telles que :

  • Context (Game) :  Elle permet d’initialiser le jeu et de déléguer le choix du prochain état à la classe Abstraite GameState.
  • State (GameState) : GameState est la classe dont heritéra tous les états et futurs états. Elle définit le comportement de base qu’un état doit avoir.
  • ConcreteState (InitialEqualState, InitialInequalState, …) :  Representera un état du jeu et implémentatera les différents comportements associés à cet état.
state diagram

General state pattern diagram (1)

On partira sur quelque chose d’assez simple comme indiqué sur la figure (1):

  • Une enum pour stocker les deux joueurs
  • Une classe Game pour initialiser le jeu
  • Une classe pour chaque état créé
  • Et une classe abstraite qui définit le comportement d’un état dont héritera chacun de nos états.

Implémentation


Commençons par réfléchir aux différents états de transition qu’on peut avoir dans un jeu de tennis. Illustrons les différents états possible à l’aide d’un digramme d’ état.

State machine diagram (2)

Notons les différents états sur la figure ci-dessus :

  • InitialEqualState : Représentera l’état où les deux joueurs sont à égalités, avec un score inférieur au score maximum (i.e score < 40 dans le tennis mais 3 dans notre cas,  juste pour ne pas trop se prendre la tête).
  • InitialInequalState : Les deux joueurs sont en inégalités avec des scores en dessous de 40 (i.e 3 dans notre cas).
  • GamePlayerOne : Cas où les scores sont au-dessus de 40 avec minimum deux points de différence en faveur du joueur 1, donc le joueur 1 est vainqueur.
  • GamePlayerTwo  : Cas où les scores sont au-dessus de 40 avec minimum deux points de différence en faveur du joueur 2, dans ce cas le joueur 2 est vainqueur.
  • AdvantagePlayerOneState : Un cas où les scores des deux joueurs sont supérieurs à 40 avec un point d’écart en faveur du joueur 1.
  • AdvantagePlayerTwoState : Dans ce cas aussi les scores des deux joueurs sont supérieurs à 40 avec un point d’écart en faveur du joueur 2.
  • DeuceState : Les deux joueurs sont à égalités avec chacun un score supérieur ou égal à 40.
  • …(On pourrait imaginer plusieurs états du moment qu’ils correspondent aux règles définies)

Il ne reste qu’à implémenter notre modèle :

Player

 

Game

GameState

Les différents états