Design Patterns
(Patron de conception)
Patron de conception à objets
(Structural Patterns)
I. Mouakher
Structural Patterns
(Structuration des classes et interfaces)
Un patron de structure permet de résoudre les
problèmes liés à la structuration des classes et leur
interface en particulier.
Description de la manière dont doivent être connectés
des objets de l’application afin de rendre ces
connections indépendantes des évolutions futures de
l’application
Découplage de l’interface et de l’implémentation de
classes et d’objets
2
Structural Patterns
Pont : Utilisation d'interface à la place d'implémentation spécifique pour
permettre l'indépendance entre l'utilisation et l'implémentation.
Façade : Ce patron de conception permet de simplifier l'utilisation d'une
interface complexe.
Adaptateur : Ce patron permet d'adapter une interface existante à une autre
interface.
Objet composite : Ce patron permet de manipuler des objets composites à
travers la même interface que les éléments dont ils sont constitués.
Proxy : Ce patron permet de substituer une classe à une autre en utilisant la
même interface afin de contrôler l'accès à la classe (contrôle de sécurité ou
appel de méthodes à distance).
Poids-mouche : Ce patron permet de diminuer le nombre de classes créées
en regroupant les classes similaires en une seule et en passant les
paramètres supplémentaires aux méthodes appelées.
Décorateur : Ce patron permet d'attacher dynamiquement de nouvelles
responsabilités à un objet
3
Traiter identiquement un objet ou une collection d'objets.
PATTERN COMPOSITE
4
Pattern Composite
Objectif
Représenter une structure arborescente d’objets
Rendre générique les mécanismes de positionnement
/ déplacement dans un arbre
Exemple : DOM Node
Fonctionnement
Une classe abstraite (Composant) qui possède deux
sous classes
Feuille
Composite : contient d’autres composants
5
Description
6
Exemple
Department interface:
Pour les feuilles, on définit deux classes pour les
départements de finance et de commercial
7
Exemple
Les deux classes implémentent la méthode
printDepartmentName() à partir du composant
de base, où elles impriment les noms de classe
pour chacune d'elles
De plus, comme il s'agit de classes feuilles, elles
ne contiennent pas d'autres objets Department.
8
Exemple
En tant que classe composite,
créons une classe
HeadDepartment :
Il s'agit d'une classe composite
car elle contient une collection
de composants Department,
ainsi que des méthodes pour
ajouter et supprimer des
éléments de la liste.
La méthode composite
printDepartmentName() est
implémentée en itérant sur la
liste des éléments feuille et en
appelant la méthode
appropriée pour chacun.
9
Exemple
CompositeDemo class:
10
Exemple
Tout d'abord, nous créons deux instances pour les
services financier et commercial.
Ensuite, nous instancions le département principal et lui
ajoutons les instances précédemment créées.
Enfin, nous pouvons tester la méthode de composition
printDepartmentName(). Comme prévu, la sortie contient
les noms de classe de chaque composant feuille :
11
Scénarios d’application du
modèle composite
L’utilisation du modèle composite est rentable partout où des opérations doivent être effectuées
sur des structures de données dynamiques dont la hiérarchie est d’une largeur et/ou d’une
profondeur complexes. Dans ce cas, on parle également d’une structure arborescente binaire,
qui est intéressante pour une grande variété de scénarios logiciels et qui est fréquemment
utilisée. Voici ci-dessous des exemples typiques.
Systèmes de fichiers : les composants les plus importants des logiciels des appareils
comprennent des systèmes de fichiers. Ces derniers peuvent être cartographiés de manière
optimale avec le modèle composite : les fichiers individuels en tant qu’objets feuilles et
les dossiers, qui peuvent eux-mêmes contenir des fichiers ou des dossiers supplémentaires, en
tant qu’objets composites.
Menus du logiciel : les menus de programme représentent également un cas d’utilisation typique
pour une structure arborescente binaire selon le composite pattern design. La barre de
menu contient une ou plusieurs entrées racine (objets composites) comme « Fichier ». Ceux-ci
donnent accès à divers éléments de menu, qui sont soit directement cliquables (Leaf), soit
contiennent des menus subdivisés (composite).
Interfaces utilisateur graphiques (GUI) : les structures arborescentes et le modèle composite
peuvent également jouer un rôle important dans la conception des interfaces
utilisateur graphiques. Loin des simples éléments de feuille comme les boutons, les champs de
texte ou les cases à cocher, le résumé des conteneurs composites comme les cadres ou les
panneaux offre une structure claire et plus de clarté.
12
Adapter, Facade et Decorator
Points communs :
Indirection=> Enveloppe (wrapper)
Protection des variations
Différences :
Adapter : Convertit une interface en une autre
(attendue par un Client)
Facade : Fournit une interface simplifiée
Decorator : Ajoute dynamiquement des
responsabilités aux méthodes d’une interface sans
la modifier
13
Modifier l'interface d'une classe pour la rendre compatible.
ADAPTER
14
Adapter
15
Adapter
Problème : Fournir une interface stable
(Adaptateur) à un composant dont l’interface
peut varier (Adapté)
16
Adapter
17
Adapter
There are the following specifications for the adapter pattern:
Target Interface: This is the desired interface class which will be
used by the clients.
Adapter class: This class is a wrapper class which implements the
desired target interface and modifies the specific request available
from the Adaptee class.
Adaptee class: This is the class which is used by the Adapter class
to reuse the existing functionality and modify them for desired use.
Client: This class will interact with the Adapter class.
18
Exemple
On veut étendre notre application en supportant en plus un
affichage fantaisie des menus pour cela on a trouvé une
bibliothèque FancyUIservice
19
20
21
FAÇADE (FACADE)
22
Façade (Facade)
Une bonne pratique de conception est d'essayer de limiter le
couplage existant entre des fonctionnalités proposées par
différentes entités. Dans la pratique, il est préférable de développer
un petit nombre de classes et de proposer une classe pour les
utiliser. C'est ce que propose le motif de conception façade.
Le but est de proposer une interface facilitant la mise en œuvre d'un
ensemble de classes généralement regroupées dans un ou
plusieurs sous-systèmes.
Le motif Façade permet d'offrir un niveau d'abstraction entre
l'ensemble de classes et celles qui souhaitent les utiliser en
proposant une interface de plus haut niveau pour utiliser les classes
du sous-système.
23
Exemple
Un client qui
utilise des
classes d'un
sous-système
directement
24
Application du DP Façade
Employer ce modèle aide à simplifier une grande partie de l'interface pour
utiliser les classes du sous-système. Il facilite la mise en œuvre de
plusieurs classes en fournissant une couche d'abstraction supplémentaire
entre ces dernières et les classes qui les utilisent. Le modèle Façade
permet donc de faciliter la compréhension et l'utilisation d'un sous-système
complexe que ce soit pour faciliter l'utilisation de tout ou partie du système
ou pour forcer une utilisation particulière de celui-ci.
25
Application du DP Façade
Le code à utiliser dans
la classe client est réduit
ce qui va en faciliter la
maintenance.
La façade masque donc
les complexités du
sous-système utilisé et
fournit une interface
simple d'accès pour les
clients qui l'utilisent.
26
27
Exemple
28
Exemple
29
Façade (Facade)
Le modèle Façade peut être utilisé pour :
Faciliterl'utilisation partielle d'un sous-système
complexe ou de plusieurs classes
Masquer l'existence d'un sous-système
Ajouter des fonctionnalités sans modifier le sous-
système
Assurer un découplage entre le client et le sous-
système (par exemple pour chaque couche d'une
architecture logicielle N tiers)
30
A'ajouter et de supprimer des comportements supplémentaires au
moment de l'exécution.
DÉCORATEUR (DECORATOR)
31
Décorateur (Decorator)
Le motif de conception décorateur (decorator en anglais) permet d'ajouter des
fonctionnalités à un objet en mettant en œuvre une solution plus souple que
l'héritage : il permet d'ajouter des fonctionnalités à une ou plusieurs méthodes
existantes d'une classe dynamiquement.
Avec l'utilisation d'un décorateur, il suffit de définir un décorateur pour chaque
fonctionnalité et de les utiliser par combinaison en fonction des besoins. L'héritage
ajoute des fonctionnalités de façon statique (à la compilation) alors que le décorateur
ajoute des fonctionnalités de façon dynamique (à l'exécution).
32
Décorateur (Decorator)
Ce motif est dédié à la création de variantes d'une classe plutôt que d'avoir
une seule classe prenant en compte ces variantes. Il permet aussi de
réaliser des combinaisons de plusieurs variantes.
Ce motif de conception est donc généralement utilisé lorsqu'il n'est pas
possible de prédéfinir le nombre de combinaisons induites par l'ajout de
nombreuses fonctionnalités ou si ce nombre est trop important. Le principe
du motif de conception décorateur est d'utiliser la composition : le
décorateur contient un objet décoré. L'appel d'une méthode du décorateur
provoque l'exécution de la méthode correspondante du décoré et des
fonctionnalités ajoutées par le décorateur.
33
Exemple 1
Ajouter dynamiquement des caractéristiques ou des responsabilités
à un objet
L’objet décoré se manipule comme l’objet de base
Les décorateurs doivent pouvoir s’empiler
Eg. Border(Scroll(Texte))
34
Exemple 1
35
Décorateur – Description
36
Exemple 2
Utilisation courante :Rajouter un comportement
à un comportement existant
37
Exemple 3
38
Exemple 3
1. définir une interface qui va déclarer
toutes les fonctionnalités des décorés.
39
Exemple 3
2) définir un décorateur de base qui implémente l'interface et possède
une référence sur une instance de l'interface. Cette référence est le
décoré qui va être enrichi des fonctionnalités du décorateur.
40
Exemple 3
3) définir les décorateurs qui héritent du décorateur de base et
implémentent les fonctionnalités supplémentaires qu'ils sont chargés de
proposer.
41
Exemple 3
42
Exemple 3
43
Exemple 3
44
Exemple 3
45
Décorateur
Permet de combiner les traitement ajoutés
Evite l’explosion du nombre de classes
Proche de Composite, mais
Composite s’intéresse aux fils du nœud
composite
Ici on rend transparent l’ajout de
fonctionnalités
46