• Aucun résultat trouvé

Patrons de conception

Dans le document en fr (Page 40-44)

1 Les patrons abîmés : contexte

I. Les patrons

I.2. Patrons de conception

Les patrons de conception ciblent essentiellement des problèmes pouvant apparaître lors de la phase de conception des logiciels à objets. Ils permettent de limiter considérablement le temps nécessaire à la résolution des problèmes et d’améliorer la documentation et la maintenance d'un système existant. Les patrons de conception donnent un nom, isolent et identifient les principes fondamentaux d'une structure générale, pour en faire un moyen utile à l'élaboration d'une conception orientée objets réutilisables [Gamma95]. Ils déterminent les classes et les instances intervenantes, leurs responsabilités et leur coopération.

Chaque patron de conception décrit un problème de conception, les circonstances où il s'applique, les effets résultants de sa mise en œuvre, ainsi que les compromis sous- entendus. Les plus répandus ont été proposés et classés par Erich Gamma, Richard Helm, Ralph Johnson et John Vlissides [Gamma95] nommés pour le reste de ce mémoire « le GoF » (Gang of Four). Ils ont regroupé, dans un catalogue, vingt-trois patrons de conception, correspondant à vingt-trois problèmes de conception récurrents.

Les patrons du GoF sont organisés en trois catégories. La première concerne les patrons créateurs, listés dans le tableau 1.5, qui proposent des solutions pour gérer l’instanciation d’objets complexes. Les patrons structurels sont listés dans le tableau 1.6. Ils proposent des agencements particuliers de classes et d’objets pour réaliser des structures de modèles plus complexes. Enfin, les patrons comportementaux, listés dans les tableaux 1.7 et 1.8, traitent de la répartition des algorithmes entre plusieurs classes et simplifient les responsabilités attribuées à chaque objet.

Patrons créateurs

Fabrication Définit une interface pour la création d'un objet, tout en laissant à ses sous- classes le choix de la classe à instancier.

Fabrique Abstraite Fournit une interface pour créer des familles d'objets apparentés ou dépendants, sans avoir à spécifier leurs classes concrètes.

Monteur Dissocie la construction de la représentation d'un objet complexe, de sorte que le même procédé de construction puisse engendrer des représentations différentes.

Prototype En utilisant une instance typique, crée de nouveaux objets par clonage. Singleton Garantit qu'une classe n'a qu'une seule instance et fournit à celle-ci un point

d'accès de type global.

Tableau 1.5 : Les patrons créateurs et leur intention [Gamma95]

À titre d’exemple, la structure d’un des patrons créateurs, le patron Singleton est présenté dans la figure 1.1.

Figure 1.1 : La structure du patron Singleton

Le patron Singleton permet d'assurer qu'une seule et même instance d'un objet donné est présente pendant toute l’exécution de l’application. Pour obtenir cette unicité, il est nécessaire de masquer tous les constructeurs de la classe, de manière à garantir que la classe est seule maître de la création de ses objets, et de publier une méthode retournant l’instance de la classe. Cette méthode instancie elle-même la classe si ce n’est pas déjà le cas, sinon, retourne l’instance qu’elle aura mémorisée lors du premier appel de cette méthode. Ce patron est très utile pour maintenir une liste de données commune à tout le système, ou pour servir de point d’accès à des sous-systèmes.

Patrons structurels

Adaptateur Convertit l'interface d'une classe existante en une interface conforme à l'attente de l'utilisateur. Permet à des classes de travailler ensemble malgré leur incompatibilité d'interface.

Composite Organise les objets en structure arborescente représentant une hiérarchie de composition. Permet un traitement uniforme des objets individuels et des objets composés.

Décorateur Attache des responsabilités supplémentaires à un objet de façon dynamique. Offre une solution alternative à la dérivation de classes pour l'extension de fonctionnalités.

Façade Fournit une interface unifiée à un ensemble d'interfaces d'un sous-système. Définit une interface de plus haut niveau, qui rend le sous-système plus facile à utiliser.

Poids mouche Supporte de manière efficace un grand nombre d'instances de granularité fine. Pont Découple une abstraction de son implémentation, afin que les deux puissent

être modifiées indépendamment.

Procuration Permet de remplacer temporairement un objet par un autre, pour en contrôler l'accès.

Tableau 1.6 : Les patrons structurels et leur intention [Gamma95]

Singleton

-instanceUnique

<<Create>>#Singleton() +getInstance()

public static Singleton getInstance() { if (instanceUnique != NULL) { instanceUnique = new Singleton(); }

return instanceUnique; }

En raison de sa structure originale incluant le patron Composite et à titre d’exemple pour les patrons structurels, la structure du patron Décorateur est présentée dans la figure 1.2.

Figure 1.2 : La structure du patron Décorateur

Le patron Décorateur permet l’ajout dynamique de comportements à un objet. Il propose une structure permettant la décoration multiple des objets en un nombre minimal de classes décorateurs. Pour l’utiliser, il est nécessaire de définir une classe racine qui représentera l’intégralité des décorations possibles (classe Décorateur), et une classe qui factorisera les responsabilités des objets pouvant être décorés (classe Composant). Il est intéressant de remarquer que les objets décorateurs sont également des objets à décorer, ce qui permet à un objet décorateur d’être décoré d’un autre objet décorateur.

Patrons comportementaux

Chaîne de responsabilités Permet de découpler l'expéditeur d'une requête de son destinataire, en donnant la possibilité à plusieurs objets de prendre en charge la requête. De ce fait, une chaîne d'objets récepteurs est créée pour faire transiter la requête jusqu'à ce qu'un objet soit capable de la prendre en charge.

Commande Réifie une requête, ce qui permet de faire un paramétrage des clients avec différentes requêtes, files d'attentes, ou historique de requêtes, et d'assurer le traitement des opérations réversibles.

État Permet à un objet de modifier son comportement lorsque son état interne change.

Interprète Pour un langage donné, définit une représentation objet de la grammaire utilisable par un interprète pour analyser des phrases du langage.

Itérateur Fournit un moyen pour accéder en séquence aux éléments d'un objet de type agrégat sans révéler sa représentation sous-jacente.

Médiateur Définit un objet qui encapsule les modalités d'interaction de divers objets. Il factorise les couplages faibles, en dispensant les objets d'avoir à faire référence explicitement les uns aux autres.

Mémento Sans violer l'encapsulation, acquiert et délivre à l'extérieur une information sur l'état interne d'un objet, afin que celui-ci puisse être rétabli ultérieurement dans cet état.

Tableau 1.7 : Les patrons comportementaux et leur intention (partie 1) [Gamma95]

Composant +operation() Decorateur +operation() ComposantConcret +operation() DecorateurConcret_A +etat +operation() +composant DecorateurConcret_B +operation() +ajouteComportement() operation() { ... composant.operation(); ... } operation() { ... super.operation(); ajouterComportement(); ... }

Patrons comportementaux

Observateur Définit une corrélation entre des objets de façon que lorsqu'un objet change d'état, tous ceux qui en dépendent, en soient notifiés et mis à jour automatiquement.

Patron de méthode Définit le squelette de l'algorithme d'une opération, en déléguant le traitement de certaines étapes à ses sous-classes. Le patron de méthode permet aux sous-classes de redéfinir certaines étapes d'un algorithme sans modifier la structure de l'algorithme.

Stratégie Définit une famille d'algorithmes, les encapsule et les rend interchangeables. Une stratégie permet de modifier un algorithme indépendamment de ses clients.

Visiteur Représente une opération à effectuer sur les éléments d'une structure d'objets. Le visiteur permet de définir une nouvelle opération sans modifier les classes des éléments sur lesquels il opère.

Tableau 1.8 : Les patrons comportementaux et leur intention (partie 2) [Gamma95]

Il est intéressant de remarquer que la description de l’intention des patrons comportementaux est plus complexe que pour les autres catégories. En effet, comme nous allons le voir pour le patron Commande, dont la structure est présentée dans la figure 1.3, en plus des aspects structurels, ces patrons organisent l’échange des messages entre les classes.

Figure 1.3 : La structure du patron Commande

Le patron Commande permet de découpler le code de l’invocateur d’une action, du code de l'action elle-même. Son fonctionnement repose sur les objets commande (classes

Commande et CommandeConcrete). Un objet commande permet de communiquer une

action à effectuer, ainsi que les arguments requis, à un récepteur qui exécutera l’action de la commande. Ainsi, lors d’une modification d’une commande, il n’est pas nécessaire de répercuter la modification sur tous les récepteurs. L’invocateur a la possibilité de constituer une liste de commandes pour les exécuter en temps différé, ainsi que pour annuler leurs effets.

Malgré les détails fournis dans le GoF, il n’est pas toujours aisé pour un concepteur de profiter pleinement de l’utilisation des patrons de conception. En effet, pour utiliser un patron, il est nécessaire de trouver lequel correspond le mieux au problème posé et comment le concrétiser sur le contexte de son problème. C'est pourquoi des travaux ont cherché à favoriser l’utilisation des patrons de conception.

Client Invocateur Commande

+execute() CommandeConcrete +etat +execute() Recepteur +action() +recepteur

II. Favoriser l’utilisation des patrons de

Dans le document en fr (Page 40-44)