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