State

Catégorie

Pattern comportemental

Problème

Permettre à un objet de modifier son comportement lorsque son état interne change. L’objet semblera changer de classe. Utile pour les objets avec un comportement dépendant de l’état complexe qui nécessiteraient autrement de grandes instructions conditionnelles.

Solution

  • Définir une interface State qui encapsule le comportement spécifique à chaque état
  • Créer des classes ConcreteState, chacune implémentant le comportement pour un état spécifique
  • Le Contexte maintient une référence à l’état actuel et délègue le comportement à celui-ci
  • Les transitions d’état sont gérées par le Contexte ou par les États eux-mêmes

Structure

  • Context : Définit l’interface d’intérêt pour les clients ; maintient une instance de State
  • State : Interface pour encapsuler le comportement associé à un état particulier
  • ConcreteState : Implémente le comportement pour un état spécifique

Avantages clés

  • Encapsule le comportement spécifique à l’état — La logique de chaque état est dans sa propre classe
  • Élimine les grandes conditions — Pas de grandes chaînes switch/if-else pour la logique d’état
  • Principe Ouvert/Fermé — Les nouveaux états peuvent être ajoutés sans modifier le code existant

Compromis

  • Plus de classes — Chaque état devient une classe séparée
  • Complexité des transitions d’état — Les transitions entre les états peuvent être difficiles à gérer

Quand l’utiliser

  • Le comportement d’un objet dépend de son état, et il doit changer de comportement à l’exécution en fonction de l’état
  • Les opérations ont de grandes instructions conditionnelles à plusieurs parties qui dépendent de l’état de l’objet
  • Le comportement spécifique à l’état doit être isolé des autres comportements

Exemples