# Patrons de conception/État

* Introduction
* Patrons du « Gang of Four »
** Patrons de création
*** Singleton
*** Prototype
*** Fabrique
*** Fabrique abstraite
*** Monteur
** Patrons de structure
*** Pont
*** Façade
*** Adaptateur
*** Objet composite
*** Proxy
*** Poids-mouche
*** Décorateur
** Patrons de comportement
*** Chaîne de responsabilité
*** Commande
*** Interpréteur
*** Itérateur
*** Médiateur
*** Mémento
*** Observateur
*** État
*** Stratégie
*** Patron de méthode
*** Visiteur
* Patrons GRASP
** Expert en information
** Créateur
** Faible couplage
** Forte cohésion
** Contrôleur
** Polymorphisme
** Fabrication pure
** Indirection
** Protection
* Patrons d'entreprise
** Logique du domaine
*** Script de transaction
*** Modèle du domaine
*** Module de table
*** Couche de service
** Architecture de source de données
*** Passerelle de table de données
*** Passerelle de ligne de données
*** Enregistrement actif
*** Gestion de données
** Comportement objet-relationnel
*** Unité de travail
*** Carte d'identité
*** Chargement différé
** Structure objet-relationnel
** Association méta-données objet-relationnel
** Présentation web
** Distribution
** Concurrence locale (hors-ligne)
** État de session (Session State Patterns)
** Patrons de base
*** Passerelle (Gateway)
*** Mapper
*** Type de base pour la couche
*** Interface séparée
*** Registre
*** Plugin
*** Objet valeur
*** Monnaie
*** Cas spécial
*** Service de substitution
*** Ensemble d'enregistrements
* Autres patrons
** Type fantôme
** Double-dispatch
** Post-Redirect-Get
** Map-Reduce
** Évaluation retardée
** Copie sur modification
** Injection de dépendance
** Inversion de contrôle
** Modèle-Vue-Contrôleur
** Modèle-Vue-Présentateur
** Écart de génération
** Objet nul
** Objets réutilisables
** Outbox
** Feature toggles
* Bibliographie et liens
* Introduction
* Patrons du « Gang of Four »
** Patrons de création
*** Singleton
*** Prototype
*** Fabrique
*** Fabrique abstraite
*** Monteur
** Patrons de structure
*** Pont
*** Façade
*** Adaptateur
*** Objet composite
*** Proxy
*** Poids-mouche
*** Décorateur
** Patrons de comportement
*** Chaîne de responsabilité
*** Commande
*** Interpréteur
*** Itérateur
*** Médiateur
*** Mémento
*** Observateur
*** État
*** Stratégie
*** Patron de méthode
*** Visiteur
* Patrons GRASP
** Expert en information
** Créateur
** Faible couplage
** Forte cohésion
** Contrôleur
** Polymorphisme
** Fabrication pure
** Indirection
** Protection
* Patrons d'entreprise
** Logique du domaine
*** Script de transaction
*** Modèle du domaine
*** Module de table
*** Couche de service
** Architecture de source de données
*** Passerelle de table de données
*** Passerelle de ligne de données
*** Enregistrement actif
*** Gestion de données
** Comportement objet-relationnel
*** Unité de travail
*** Carte d'identité
*** Chargement différé
** Structure objet-relationnel
** Association méta-données objet-relationnel
** Présentation web
** Distribution
** Concurrence locale (hors-ligne)
** État de session (Session State Patterns)
** Patrons de base
*** Passerelle (Gateway)
*** Mapper
*** Type de base pour la couche
*** Interface séparée
*** Registre
*** Plugin
*** Objet valeur
*** Monnaie
*** Cas spécial
*** Service de substitution
*** Ensemble d'enregistrements
* Autres patrons
** Type fantôme
** Double-dispatch
** Post-Redirect-Get
** Map-Reduce
** Évaluation retardée
** Copie sur modification
** Injection de dépendance
** Inversion de contrôle
** Modèle-Vue-Contrôleur
** Modèle-Vue-Présentateur
** Écart de génération
** Objet nul
** Objets réutilisables
** Outbox
** Feature toggles
* Bibliographie et liens
[ Modifier le sommaire ]
La technique de l'État est un patron de conception comportemental utilisé en génie logiciel. Ce patron de conception est utilisé entre autres lorsqu'il est souhaité pouvoir changer le comportement de l'État d'un objet sans pour autant en changer l'instance.

## Principe Général

La classe censée changer d'état a un lien vers une classe abstraite "État". Cette classe abstraite "État" définit les différentes méthodes qui seront à redéfinir dans les implémentations. Dans chaque classe dérivée d'État, l'appel à la méthode X pourra avoir un comportement différent.
La classe pouvant changer d'état appellera les services de sa classe d'état dont l'instance change quand le comportement de notre classe change. De plus l'instance de la classe pouvant changer d'état peut être passée en paramètre à la méthode X de sa classe d'état. Ceci permet de changer l'état de la classe pendant l'exécution de la méthode X en instanciant un nouvel état.
Ce patron permet donc à la classe de passer d'un état à l'autre de telle façon que cette dernière apparaît changer de type dynamiquement (sans changer d'instance).
Exemple : Un programme de dessin utilise une interface abstraite pour représenter un outil. Chaque instance de ses classes dérivées concrètes représente un type d'outil différent. Quand l'utilisateur change d'outil, une nouvelle instance de la classe dérivée associée est créée.

## Diagramme de classes

Le patron de conception État peut être représenté par le diagramme de classes UML suivant :
La classe Contexte utilise différentes instances des classes concrètes dérivées de la classe abstraite État afin de représenter ses différents états. Chaque état concret traite la requête de manière différente.

## Exemples
### C++

En reprenant l'exemple du programme de dessin :
Chaque outil a besoin de gérer les évènement de souris : déplacement, bouton enfoncé, bouton relâché. L'outil plume est alors le suivant :
Une classe utilisant le patron d'état ci-dessus :
L'état de l'outil de dessin est complètement représenté par une instance de la classe AbstractTool. Cela facilite l'ajout de nouveaux outils et conserve leur comportement dans les sous-classes de la classe AbstractTool.

### Contre-exemple utilisant switch

Le patron de conception peut être utilisé pour remplacer des instructions switch et if, qui peuvent être difficile à maintenir et moins typées.
L'exemple suivant est similaire au précédent, mais ajouter un nouvel outil dans cette version est beaucoup plus difficile.