Chapitre 2 Patrons de conception
Responsable de cours : Sahar GHRAB
Année universitaire : 2023/2024
Discipline : 1MR-SII
1
Introduction
• La taille des logiciels devient de plus en plus
volumineux et la croissance des changements
technologiques est de plus en plus élevé.
• L’utilisation de l’approche objet: afin de
réduire le nombre de concepts.
• La conception orientée objet est une
conception réutilisable, extensible, adaptable,
performante, extrêmement difficile.
2
Introduction
• L’expérience:
– Ne pas réinventer la roue
– Réutiliser systématiquement des solutions
existantes
– Avoir une conception modulaire, adaptable
Patron de conception
3
Patron de conception
• Patron de conception reconnu comme bonne pratique en
réponse à un problème de conception d'un logiciel. Il décrit
une solution standard, utilisable dans la conception de
différents logiciels
• Les patrons de conception décrivent des procédés de
conception généraux et permettent en conséquence de
capitaliser l'expérience appliquée à la conception de
logiciel.
• Ils ont une influence sur l‘architecture logicielle d’un
système informatique.
• En général, un patron de conception décrit une structure
de classes utilisant des interfaces, et s'applique donc à des
développements logiciels utilisant la programmation
orientée objet.
4
Patron de conception
« Chaque patron décrit un problème qui se manifeste constamment dans notre
environnement, et donc décrit le cœur de la solution à ce problème, d’une façon telle
que l’on puisse réutiliser cette solution des millions de fois, sans jamais le faire deux fois
de la même manière » (Alexander, 1977).
« Les patrons offrent la possibilité de capitaliser un savoir précieux né du savoir-faire
d’experts » (Buschmann, 1996).
• Le nom (augmenter le niveau d’abstraction)
• Le problème (contexte, pre/post conditions)
Patron • La solution (indépendante de la réalisation)
• Les conséquences (flexibilité, extensibilité,
portabilité)
5
Types de patrons de conception
• De création: décrivent comment régler les problèmes d'instanciation de classes,
c'est à dire de création et de configuration d'objets (objet en unique exemplaire
par exemple)
– Singleton, prototype, fabrique, fabrique abstraite, monteur
• De structure: décrivent comment structurer les classes afin d'avoir le minimum
de dépendance entre l'implémentation et l'utilisation dans différents cas (liés aux
problèmes d’organisation des objets dans un logiciel).
– Pont, façade (facade), adaptateur (adapter), composite, proxy, poids-mouche,
décorateur (decorator)
• De comportement: décrivent une structure de classes pour résoudre les
problèmes liés aux comportements, à l'interaction entre les classes et la
communication entre les objets
– Chaîne de responsabilité, commande, interpréteur, itérateur (iterator),
médiateur (mediator), mémento, observateur (observer), état, stratégie,
patron de méthode, visiteur 6
PATRONS DE CRÉATION
7
Singleton
• Le singleton est un patron de conception qui garantit que
l’instance d’une classe n’existe qu’en un seul exemplaire,
tout en fournissant un point d’accès global à cette instance.
• Il est utilisé lorsque l'on a besoin d'exactement un objet
pour coordonner des opérations dans un système. Le
modèle est parfois utilisé pour son efficacité, lorsque le
système est plus rapide ou occupe moins de mémoire avec
peu d'objets qu'avec beaucoup d'objets similaires.
• Le singleton vous permet d’accéder à l’objet n’importe où
dans le programme, telle une variable globale. Cependant,
il protège son instance et l’empêche d’être modifiée.
8
Singleton
Gouvernorat est un singleton. Un pays ne
peut avoir qu’un seul gouvernement officiel.
Quels que soient les individus qui composent
un gouvernement, l’appellation « Le
gouvernement de X » est un point global
d’accès qui identifie le groupe de personnes
au pouvoir.
1. Rendre le constructeur par défaut privé afin d’empêcher les autres objets d’utiliser l’opérateur new avec la
classe du singleton.
2. Mettre en place une méthode de création statique qui se comporte comme un constructeur. Cette méthode 9
appelle le constructeur privé pour créer un objet et le sauvegarde dans un attribut statique.
Prototype
• utilisé lorsque la création d'une instance est complexe ou
consommatrice en temps.
• Plutôt que créer plusieurs instances de la classe, on copie la
première instance et on modifie la copie de façon
appropriée.
• Pour implanter ce patron il faut déclarer une classe
abstraite spécifiant une méthode abstraite
• Toute classe nécessitant un constructeur polymorphique
dérivera de cette classe abstraite et implantera la méthode
clone().
• Le client de cette classe, au lieu d'écrire du code invoquant
directement l'opérateur "new" sur une classe explicitement
connue, appellera la méthode clone() sur le prototype ou
passera par un mécanisme fourni par un autre patron
10
Prototype
Dans la vie réelle, des prototypes sont utilisés
pour exécuter des tests avant de lancer les
chaînes de production d’un produit.
le Prototype produit des copies exactes
d’objets géométriques, sans coupler le code à
11
leurs classes.
Prototype
le Prototype produit des copies exactes
d’objets géométriques, sans coupler le code à
leurs classes.
12
Prototype
13
PATRONS DE STRUCTURE
14
Composite
• Un objet composite est constitué d'un ou
de plusieurs objets similaires (ayant des
fonctionnalités similaires).
• L'idée est de manipuler un groupe
d'objets de la même façon que s'il
s'agissait d'un seul objet.
• Les objets ainsi regroupés doivent
posséder des opérations communes.
15
Composite
Objet déclare l'interface pour la composition d'objets
met en œuvre le comportement par défaut
ObjetSimple représente les objets manipulés, ayant une
interface commune
ObjetComposite définit un comportement pour les 16
composants ayant des enfants, les stockent et les gèrent
Composite
17
Composite
18
Adapter
• Adaptateur est un patron de conception qui
permet de convertir l'interface d'une classe en
une autre interface que le client attend.
• Adaptateur fait fonctionner un ensemble de
classes qui n'auraient pas pu fonctionner sans lui,
à cause d'une incompatibilité d'interfaces.
IAdaptateur : Définit l'interface métier utilisée par la classe cliente.
Adapté : Définit une interface existante devant être adaptée.
Adaptateur : Fait correspondre l'interface de Adapté à l'interface
IAdaptateur, en convertissant l'appel aux méthodes de l'interface
IAdaptateur en des appels aux méthodes de la classe Adapté.
19
Façade
• Le façade est un patron de conception qui cache
une conception et une interface ou un ensemble
d'interfaces complexes difficiles à comprendre.
• Il fournit une interface unique, simplifiée ou
unifiée, pour accéder à un ensemble d’interfaces
d’un sous-système complexe.
• Motivation:
– Réduire la complexité d’un système en le découpant
en plusieurs sous-systèmes
– Eviter la dépendance entre les clients et les éléments
du sous-système
20
Façade
21
Decorator
• Le décorateur est le nom d'un patron de
conception de structure permettant d'attacher
dynamiquement de nouveaux comportements
ou responsabilités à un objet.
• Les décorateurs offrent une alternative assez
souple à l'héritage pour composer de
nouvelles fonctionnalités.
22
Decorator
23
PATRONS COMPORTEMENTAUX
24
Patrons comportementaux
• Les différents patrons de comportement sont les suivants :
– Chaîne de responsabilité: Permet de construire une chaîne de traitement
d'une même requête.
– Commande (Command): Encapsule l'invocation d'une commande.
– Interpréteur: Interpréter un langage spécialisé.
– Itérateur (Iterator): Parcourir un ensemble d'objets à l'aide d'un objet de
contexte (curseur).
– Médiateur (Mediator): Réduire les dépendances entre un groupe de classes
en utilisant une classe Médiateur comme intermédiaire de communication.
– Mémento: Mémoriser l'état d'un objet pour pouvoir le restaurer ensuite.
– Observateur (Observer): Intercepter un évènement pour le traiter.
– État (State): Gérer différents états à l'aide de différentes classes.
– Stratégie: Changer dynamiquement de stratégie (algorithme) selon le
contexte.
– Patron de méthode: Définir un modèle de méthode en utilisant des méthodes
abstraites.
– Visiteur (Visitor): Découpler classes et traitements, afin de pouvoir ajouter de
nouveaux traitements sans ajouter de nouvelles méthodes aux classes 25
existantes.
Observer
• Observer permet de coordonner deux objets : un sujet et un
observateur (ou +eurs)
• Le sujet a un état interne (défini par la valeur de ses attributs) qui
change.
• L’observateur doit se synchroniser avec les changements
• C’est un patron de conception comportemental qui permet de
mettre en place un mécanisme de souscription pour envoyer des
notifications à plusieurs objets au sujet d’événements concernant
les objets qu’ils observent
• Quand utiliser le patron Observer?
– Quand le changement d'un objet se répercute vers d'autres
• Une abstraction a plusieurs aspects, dépendant l'un de l'autre.
• Encapsuler ces aspects indépendamment permet de les réutiliser séparément
– Quand un objet doit prévenir d'autres objets sans pour autant les
connaitre
26
Observer
Observer
27
Observer
Observer
Diagramme de classe statique
– Comporte un état interne type non spécifié.
– un patron de conception est indépendant de ce genre de détails
– Est chargé de gérer une collection d’abonnés capable de recevoir des
notifications
– Est chargé d’envoyer un message aux abonnés lorsque son état change
Interface
Est capable de
réagir à la réception
d’un message de
notification venant
d’un sujet
Contient des opérations d’accès à l’état
Update sera mise en œuvre par ConcreteObserver héritant d’Observer.
Chaque méthode mettant en œuvre update pourra interroger 28le sujet
pour déterminer comment se synchroniser
Observer
Observer
Diagramme de séquence
29
Visitor
• Le patron visitor fait la représentation d’une opération applicable
aux éléments d’une structure d’objet.
• Il permet de définir une nouvelle opération sans qu’il soit
nécessaire de modifier la classe des éléments sur lesquels elle agit.
• Quand?
– Lorsque la structure de l’objet est composée de nombreuses classes et
que de nouvelles opérations sont souvent nécessaires
– Difficulté de devoir implémenter une nouvelle sous-classe pour
chaque nouvelle opération.
– Le système obtenu disposerait de différentes classes de nœud qui
seraient non seulement trop compliquées à comprendre mais aussi à
entretenir et à modifier.
– Visitor permet d’ajouter de nouvelles fonctionnalités virtuelles à une
famille de classes sans avoir à les modifier.
30
Visitor
• Un visiteur possède une méthode par type d'objet traité.
• Pour ajouter un nouveau traitement, il suffit de créer une
nouvelle classe dérivée de la classe Visiteur. On n'a donc
pas besoin de modifier la structure des objets traités,
contrairement à ce qu'il aurait été obligatoire de faire si on
avait implémenté les traitements comme des méthodes de
ces objets.
• L'avantage du patron visiteur est qu'un visiteur peut avoir
un état. Ce qui signifie que le traitement d'un type d'objet
peut différer en fonction de traitements précédents. Par
exemple, un visiteur affichant une structure arborescente
peut présenter les nœuds de l'arbre de manière lisible en
utilisant une indentation dont le niveau est stocké comme
valeur d'état du visiteur.
31
Visitor
32
[Link]
Visitor
[Link]
Exemple illustratif
9/design-pattern-visitor/exemple-dutilisation33
State State
• Le patron State (état) 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.
34
State State
35
State State
Semblable à un automate fini
possédant un ensemble d’états
-Inconvénient automate: utilisation de
plusieurs opérateurs conditionnels
Pour faire passer le contexte dans un autre état, remplacez
l’objet état par un autre qui représente son nouvel état.
Cette structure ressemble de près au patron de Stratégie, mais
il y a une différence majeure.
Dans le patron état, les états ont de la visibilité entre eux et
peuvent lancer les transitions d’un état à l’autre, alors que les
stratégies ne peuvent pas se voir.
36
Strategy
Exemple 1
Le comportement n’est pas le même lors de
l’utilisation d’un paiement Paypal et CrediatCard
37
Exemple extrait du [Link]
Strategy
Un bon directeur technique d’une équipe de football doit prévoir les scénarios possibles et
préparer une stratégie pour chaque contexte.
De cette façon, la formation et/ou le comportement de vos joueurs doivent changer en
fonction des différents facteurs qui surviennent dans le développement du jeu, tels que :
lorsque vous attaquez, lorsque vous défendez, un joueur est expulsé, vous gagnez, vous ils
perdent, ils jouent à l'extérieur, ils jouent à domicile, le rival est faible, le rival est fort, etc.
Exemple 2
Exemple extrait du
[Link] 38
pattern-patron-estrategia/
Strategy
• Le modèle Stratégie est une alternative à l'héritage, si
vous envisagez d'utiliser l'héritage pour pouvoir ajouter
de nouveaux comportements à vos objets, il serait
pratique d'utiliser ce modèle.
• Si au sein de votre classe vous faites un usage intensif
des conditionnels if, else, switch, case, cela signifie que
votre classe se voit attribuer de nombreux
comportements et/ou responsabilités, ce qui est
généralement un indicateur de la nécessité d'appliquer
le modèle de stratégie pour pouvoir encapsuler ces
comportements et les déléguer à une autre classe ou
objet.
39
Strategy
• Le patron de conception Strategy cherche principalement à
séparer un objet de ses comportements/algorithmes en
encapsulant ces derniers dans des classes à part et les
rendant interchangeable.
• Il est utile pour des situations où il est nécessaire de
permuter dynamiquement les algorithmes utilisés dans une
application.
• Il permet de laisser les algorithmes changer
indépendamment des clients qui les emploient.
• Quand Strategy? Dès lors qu'un objet peut effectuer
plusieurs traitements différents, dépendant d'une variable
ou d'un état.
40
Strategy
41
Strategy
42
Strategy
43
Strategy
44
Choix de pattern à utiliser?
Choix de patron à utiliser
• Dépendance d'une implantation...pour rendre plus souple
utilisez AbstractFactory, Bridge, Memento, Proxy
• Dépendance d'un algorithme particulier...Builder, Iterator,
Strategy, TemplateMethod, Strategy
• Couplage fort...relâcher les relations utilisez AbstractFactory,
Bridge, Chain Of Responsibility, Command, Facade, Mediator,
Observer
• Etendre les fonctionnalités en sous-classant peut être couteux
(tests, compréhension des superclasses, etc) utilisez aussi la
délégation, la composition...Bridge, Chain Of Responsibility,
Composite, Decorator, Observer, Strategy, Proxy
• Impossibilité de modifier une classe...absence du source,
trop de répercussions, voyez Adapter, Decorator, Visitor 45
Exercice 1
• Dans un programme qui permet de faire des plans
d'une pièce (cuisine, salon, ...) avec ses meubles, nous
avons, suivant les cas, plusieurs modes d'affichage d'un
même plan :
– le plan lui même avec l'emplacement des différents meubles
: le plan de base;
– le plan de base avec les mesures des meubles et de la pièce;
– le plan de base avec un devis;
– le plan de base avec un devis et les mesures.
Quel Design Pattern identifiez-vous ?
Le pattern décorateur est une bonne solution. Effectivement, On pourra considérer le
PlanDeBase, comme la classe minimale et nécessaire qui pourra être décorée par
46
Mesures et/ou le devis.
Exercice 2
• Le paquetage [Link] fournit une hiérarchie de classes utiles
pour la création d'interfaces graphiques. Tous les éléments
graphiques de Swing sont des composants. Ils dérivent de la
classe [Link].
• Certains de ces composants sont des conteneurs ( JWindow,
JDialog, JFrame, JPane,... ) ils peuvent contenir d'autres
composants.
• Les composants atomiques (ou Widgets) comme les boutons, les
ascenseurs, les menus déroulants, les champs de texte, etc.
(JButton, JLabel, JTextField, JTextArea, JComboBox, ...) sont des
éléments de base et ne peuvent pas en contenir d’autres.
• Proposez une modélisation de la structure hiérarchique des
éléments graphiques de Swing. COMPOSANT
COMPOSANT
CONTENEUR
ATOMIQUE
47
MENU BOUTON jwindow JDIALOG
Exercice 3
• Une compagnie de construction de téléphone portable
crée des téléphones portables avec des différentes
caractéristiques camera, wifi, 3G, Bluetooth, etc).
Chaque caractéristique ajouté a son coût spécifique. La
compagnie souhaite implémenter son système de façon
à ne pas changer la totalité du système quand elle
introduit un nouveau modèle de téléphone portable
ave des caractéristiques différentes
Quel pattern adéquat à utiliser?
Le pattern décorateur est une bonne solution.
Effectivement, On pourra considérer le TéléphonePortable, comme sujet et le décorer
48
par les caractéristiques.
Exercice 3
Bluetooth
3G
CELLpHONE Decorator
Wifi
Camera
49
Exercice 3
50
Java Script
Exercice 3
• La compagnie décide d’introduire un nouveau
modèle avec caméra, wifi et Bluetooth.
• Voilà comment décorer l’objet
51
Exercice 4
• Imaginez que vous devez vous rendre à l’aéroport. Vous pouvez
prendre le bus, appeler un taxi ou enfourcher votre vélo. Ce sont
vos stratégies de transport. Vous pouvez sélectionner une de ces
stratégies en fonction de certains facteurs, comme le budget ou
les contraintes de temps.
• Quel est le patron approprié à cette situation.
52
Exercice 4
• Plusieurs options de transport existent: conduire sa propre voiture, prendre un taxi,
une navette aéroport, un bus urbain ou encore un service de limousine.
• Pour certains aéroports, des métros et des hélicoptères sont également disponibles
comme moyen de transport vers l'aéroport.
• N’importe lequel de ces modes de transport amènera un voyageur à l’aéroport et ils
peuvent être utilisés de manière interchangeable.
• Le voyageur doit choisir la stratégie basée sur des compromis entre coût, commodité
et temps.
• Identifier un algorithme (c'est-à-dire un
comportement) auquel le client préférerait accéder
via un « point flexible ».
• Spécifier la signature de cet algorithme dans une
interface.
• Enterrer les détails d’implémentation alternatifs dans
les classes dérivées. Les clients de l'algorithme se
couplent à l'interface. 53
Exercice 4
• Quand utiliser le patron Startégie?
– si vous voulez avoir différentes variantes d’un algorithme à l’intérieur
d’un objet à disposition, et pouvoir passer d’un algorithme à l’autre
lors de l’exécution: modifier indirectement le comportement de
l’objet lors de l’exécution par différents sous-objets qui peuvent
accomplir des sous-tâches spécifiques de différentes manières.
– si vous avez beaucoup de classes dont la seule différence est leur
façon d’exécuter un comportement: extraire des variantes d’un
comportement dans une hiérarchie de classes séparées et de
combiner les classes originales dans une seule, évitant de dupliquer du
code.
– isoler la logique métier d’une classe, de l’implémentation des
algorithmes dont les détails ne sont pas forcément importants pour
le contexte: séparer le code, les données internes et les dépendances
des divers algorithmes du reste du code
– si votre classe possède un gros bloc conditionnel qui choisit entre
différentes variantes du même algorithme:
54
Exercice 5
• Vous avez développé un Blog, et vous
souhaitez pouvoir envoyer automatiquement
des mails et des SMS aux utilisateurs inscrits,
chaque fois qu’un nouvel article est publié.
• Quel est le patron adéquat à utiliser dans
cette situation ? donner son diagramme de
classes correspondant.
55
Exercice 5
56
Patron Observer: Station météo:
Spécification
• Objectif: Construire une nouvelles génération de
stations d’observation météo sur Internet
• Besoin: Afficher les conditions courantes, les
statistiques météorologique et les prévisions météo.
– Poursuivre les conditions météorologiques (Température,
Humidité, Pression, etc.)
– On veut mettre en œuvre une API (ENIS-METEO) de façon
que d’autres développeurs peuvent écrire leur propre
afficheur de météo.
• Conception: OO
– Une classe WeatherData qui récupère les données de la
station météo (ENIS-METEO) et les offre aux afficheurs.
57
Patron Observer: Station météo:
Analyse
Afficher
Capteur
d’humidité Tirer (pull)
Capteur de
température
Weather Station
WeatherData
Object
Capteur de Conditions
pression courantes
Le fournisseur ENIS-METEO A implémenter
• Il faut créer une application qui utilise l’objet WeatherData afin de
mettre à jour trois afficheurs: les conditions courantes, les statistiques
météorologiques & les prévisions météo.
58
Patron Observer: Station météo:
Conception Ces trois méthodes retournent les
WeatherData
mesures les plus récentes
getTemperature()
getHumidity()
getPressure() Cette méthode sera appelée chaque
fois qu’on met à jour les mesures
measurementChanged()
\\autre méthodes
• Nous allons développer trois afficheurs:
– conditions courantes ([Link])
– statistiques météorologique ([Link])
– prévisions météo ([Link])
• Rq: On ne s’intéresse pas à la manière dont les variables sont fixées.
On suppose que l’objet WeatherData connait comment les mettre à
jour à partie de la station ENIS-METEO
59
Patron Observer: Station météo:
Une solution possible
Récupérer les mesures
public class WeatherData les plus récentes
{
//attributs
void setMeasurement(){
float temperature = getTemperature();
float humidity = getHumidity()
float pressure = getPressure()
currentConditionsDisplay. update(temperature, humidity, pressure);
statisticsDisplay. update(temperature, humidity, pressure);
forecastDisplay. update(temperature, humidity, pressure);
}
//autres méthodes
}
Mettre à jour les afficheurs
avec les nouvelles mesures
60
Patron Observer: Station météo:
Constat
• Problème : En codant des implémentations concrètes, on ne peut
pas ajouter/supprimer d’autres afficheurs, sans faire un changement du
programme!
– Rq: on peut au moins utiliser une interface qui contient la
méthode update()
• Solution : le patron observer
• Exemple:
1. Une maison d’édition commence l’édition d’un journal
2. Vous vous inscrivez à ce journal, et pour chaque nouvelle
édition, vous recevez votre copie
3. Vous vous désinscrivez lorsque vous ne voulez plus recevoir
des journaux
4. Les gens, les hôtels etc. peuvent constamment s’inscrire et se
61 désinscrire à ce journal
Le patron Facade:
Démarrer un home-cinéma
Tuner Amplifier
tuner DVDPlayer
Démarrer le HC: amplifier
dvdPlayer
on() amplifier
baisser la lumière off() ….
on()
on()
allumer l’écran setAm()
off()
off()
play()
setFM()
setCD()
démarrer l’ampli … setDVD()
stop()
pause()
démarrer le DvDplayer …
…
le brancher avec l’mpli
Screen
jouer le DvD
up()
etc.. down()
62 Et bien d’autres classes
Le patron Facade:
Les classes d’un Home cinéma
HomeCinema
WatchDVD() Le client invoque les
La Façade: une nouvelle méthodes sur la Façade
classe pour le HomeCinema WatchTV()
avec peu de méthode WatchDVD()
….
Tuner Amplifier DVDPlayer
amplifier tuner amplifier
dvdPlayer
on() …. on()
off() off() La classe Façade traite les
setAm() on() play() composants du
setFM() off() stop() HomeCinema comme des
… setCD() pause() sous-systèmes qu’il invoque
setDVD() …
…
pour implémenter ses
CDPlayer méthodes
amplifier Projector
on() Screen on()
off() off()
up()
play()
down()
stop()
pause()
63
Façade:
Le diagramme de classes du patron
Une interface unifiée et
simple à utiliser
Client Façade
Un client heureux car
son travail devient
facile grâce à la façade Les classes des sous-systèmes
Systèmes complexes
64
Patron Visitor: application
• Nous disposons d’une hiérarchie de formes
géométriques (par exemple, cercle, carré,
triangle) et que nous voulions implémenter
une fonctionnalité permettant de calculer
l'aire et le périmètre de ces formes sans
modifier les classes existantes.
• Quel est le patron adéquat implémenter dans
cette situation?
65
Patron Visitor: application
66
Patron Visitor: application
67
Patron State: lecteur vidéo
• 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
Quel est le patron approprié à cette situation?
68
Patron State: lecteur vidéo
Sans patron de conception
69
Patron State: lecteur vidéo
Avec patron de conception
1
2
70
Patron State: lecteur vidéo
Avec patron de conception
71
Patron State: lecteur vidéo
Avec patron de conception
72
Patron State: lecteur vidéo
Avec patron de conception
• Après avoir testé la méthode classique et celle utilisant le pattern
State, 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
73
Patron State: lecteur vidéo
Avec patron de conception
74