Vous êtes sur la page 1sur 31

Patron de conception Composite

Intention

Organiser les objets en structures arborescentes pour reprsenter des hirarchies tout-parties.
Les composites permettent aux client de manipuler les objets composs et les objets individuels uniformment.

Motivation

Les applications graphiques contiennent plusieurs sortes dobjets Pour regrouper les objets, on utilise des contenants (hirarchie dobjets) qui demandent la plupart du temps un traitement uniforme

Une classe abstraite (Graphic) reprsente la fois les objets primitifs et leur contenant. Mthode draw

Mthodes partages par tous les objets composites : accs et gestion des fils

Quand appliquer le DP Composite?

Pour reprsenter des hirarchies dobjets tout-parties. Pour permettre aux clients dignorer la diffrence entre les objets composs et les objets individuels.

Les clients vont pouvoir manipuler tous les


objets uniformment.

Structure

Participants

Component (Graphic) Dclare linterface des objets faisant partie du composite. Implmente le comportement par dfaut de linterface partage par toutes les classes Dclare une interface pour accder et grer les fils Dfinit une interface pour accder au pre dans la structure rcursive et limplmente le cas chant. (optionel) Leaf (Rectangle, Line, Text, etc.) Reprsente les feuilles du composite. Une feuille na pas de fils. Dfinit le comportement des objets primitifs du composite. Composite (Picture) Dfinit le comportement des composantes qui ont des fils. Emmagasine les fils. Implmente les mthodes lies aux fils de linterface Component Client Manipule les objets du composite travers linterface Component

Collaborations

Les clients utilisent linterface Component pour interagir avec les objets de la structure composite.
Si le destinataire est une feuille, alors la requte est effectue directement. Si le destinataire est un composite, alors gnralement la requte est transmise aux fils des oprations additionnelles peuvent aussi tre faites avant et/ou aprs la transmission aux fils

Consquences - avantages

Dfinition dune hirarchie de classes forme dobjets primitifs et dobjets composites

Les objets primitifs peuvent tre composs en objets plus complexes

qui peuvent tre composs en objets plus complexes

Lorsque le code du client sattend un objet primitif, il peut aussi recevoir un objet composite.

qui peuvent tre

Simplifie le client.

Les clients peuvent manipuler les structures composites et les objets individuels uniformment. Les clients ne savent pas (et ne devraient pas se proccuper de savoir) sils manipulent un objet composite ou une feuille. Cela simplifie le code du client en vitant les tests sur la classe des objets qui forment le composite.

Facilite lajout de nouvelles sortes de composantes


Les nouvelles sous-classes de Composite ou Leaf fonctionnent automatiquement dans les structures existantes et le code des clients. Les clients ne doivent pas tre modifis pour tenir compte des nouvelles classes.

Consquences - dsavantages

Peut rendre le design trop gnral

Le dsavantage de faciliter lajout de nouvelles composantes est de rendre plus difficile lapplication de contraintes sur les composantes dun composite. Dans certains cas, on dsire ne permettre que certains types de composantes dans un composite. Dans un composite, on ne peut pas utiliser le systme de typage pour assurer cette contrainte. Il faudra faire les tests lexcution.

Implmentation I

Rfrence explicite au pre.

Peut simplifier les parcours et la gestion dune structure composite

(e.g. la suppression dun noeud).

Facilite limplmentation du DP Chain of Responsibility. En gnral, la rfrence (variable dinstance) au pre est dfinie dans la classe/interface Component.

Les classes Leaf et Composite hritent de cette rfrence et des mthodes de gestion associes.

Maintenir la cohrence des liens pre-fils.


Ne permettre la modification de la variable dinstance que lors de lajout ou la suppression de noeuds. Limplmenter une seule fois dans les mthodes add et remove de la classe Composite.

Implmentation II

Partage de composantes

Par exemple pour rduire les besoins en mmoire Difficile grer si une composante peut avoir plusieurs pres

Peut mener des ambiguits par exemple si une requte percole vers la racine
Solution : Patron de conception Flyweight

Explique comment retravailler le design pour viter demmagasiner tous les parents ensemble dans le fils partag Permet dexternaliser en tout ou en partie ltat du fils.

Implmentation III

Maximiser linterface Component.

Y dfinir le plus possible de mthodes communes

pour viter de devoir tenir compte de la classe du noeud.

Component
implmentations par dfaut de ces mthodes

Leaf
redfinition de ces mthodes

Par contre, toutes les oprations des noeuds intermdiaires ne sont pas ncessairement significatives pour les feuilles,

Par exemple les feuilles ne peuvent pas avoir de fils.

Comment Component peut-il spcifier une implmentation par dfaut ?

Implmentation IV

Dclaration des mthodes de gestion des fils (add remove).

La classe Composite implmente les mthodes dajout et de retrait des fils. Par contre, qui doit dclarer ces mthodes ?

Dans linterface commune Component ?

il faudra les rendre significatives pour les feuilles

Dans la classe Composite et ses sous-classes?

Compromis entre la scurit et la transparence

Transparence dclaration la racine de la hirarchie, i.e. dans linterface commune Component traitement uniforme des composantes au dtriment de la scurit car les clients peuvent invoquer des mthodes non significatives. Scurit dclaration dans la classe Composite toute tentative dajouter ou supprimer des fils partir des feuilles sera dtecte la compilation au dtriment de la transparence car les composites et feuilles auront des interfaces diffrentes

Habituellement il est prfrable de faire chouer add et remove par dfaut

par exemple en dclenchant une exception

Implmentation V

Est-ce que limplmentation de Component utilise une liste de Components pour conserver les fils?

Dfinir lensemble des fils comme une variable dinstance de la classe Component

La classe Component contient les dclarations des oprations daccs et de gestion des fils.

Placer un pointeur vers le fils dans la classe de base


pnalit : cot au niveau de lespace-mmoire pour chaque feuille, mme si une feuille na jamais de fils

Cette approche est valable seulement sil y a relativement peu feuilles dans la structure

Implmentation VI

Ordonnancement des fils.

Lorsque lordre des fils est important, il faut porter une attention particulire au design des interfaces (au niveau de lordre et de la gestion des accs aux fils) afin de grer correctement la squence des fils

Le patron de conception Iterator peut savrer fort utile cette fin.

Implmentation VII

Utiliser des caches pour amliorer la performance Sil est ncessaire de parcourir ou rechercher des composites frquemment, la classe Composite peut utiliser des caches du parcours ou de la recherche dinformation dans ses fils La classe Composite peut placer dans une cache des rsultats courants ou simplement de linformation qui permettent de court-circuiter le parcours ou la recherche.

Une modification dune composante exigera dinvalider les caches de ses parents Cette approche fonctionne le mieux lorsque les composantes connaissent leur parent Par consquent si des caches sont utilises, il faut dfinir une interface qui permette dindiquer aux composites que leur cache est invalide.

Figure 9.4

DNS name servers


ns1.nic.uk (uk) co.uk ac.uk ...

a.root-servers.net (root) uk purdue.edu yahoo.com ....

Note: Name server names are in italics, and the corresponding domains are in parentheses. Arrows denote name server entries

ns.purdue.edu (purdue.edu)

ns0.ja.net (ac.uk) ic.ac.uk

* .purdue.edu

authoritative path to lookup:

jeans-pc.dcs.qmw.ac.uk
alpha.qmw.ac.uk (qmw.ac.uk)

qmw.ac.uk ...

dns0.dcs.qmw.ac.uk (dcs.qmw.ac.uk)

dns0-doc.ic.ac.uk (ic.ac.uk)

dcs.qmw.ac.uk *.qmw.ac.uk

*.dcs.qmw.ac.uk

*.ic.ac.uk

Without caching
ns1.nic.uk (uk) co.uk ac.uk ...

DNS in typical operation


a.root-servers.net (root)
uk purdue.edu yahoo.com .... ns.purdue.edu (purdue.edu)

ns0.ja.net (ac.uk) ic.ac.uk qmw.ac.uk ...

* .purdue.edu

IP: alpha.qmw.ac.uk
dns0-doc.ic.ac.uk (ic.ac.uk)

alpha.qmw.ac.uk (qmw.ac.uk)

dns0.dcs.qmw.ac.uk (dcs.qmw.ac.uk)

client.ic.ac.uk

IP:jeans-pc.dcs.qmw.ac.uk IP:ns0.ja.net
dcs.qmw.ac.uk *.qmw.ac.uk *.dcs.qmw.ac.uk *.ic.ac.uk

14
jeans-pc.dcs.qmw.ac.uk ?

IP:dns0.dcs.qmw.ac.uk

Implmentation VIII

Qui devrait dtruire les composantes?

Dans les langages sans ramasse-miettes, il


est en gnral prfrable de rendre un Composite responsable de la destruction des fils lorsque celui-ci est dtruit

Une exception cette rgle survient lorsque


les objets Leaf sont immuables et peuvent par consquent tre partags.

Implmentation IX

Quelle est la structure de donnes la plus approprie pour emmagasiner les composantes?
Les composites peuvent utiliser un grand choix de structures de donnes pour emmagasiner les fils : listes chanes, arbres, vecteurs, tables de hachage (hash tables), etc.

Le choix de la structure de donnes dpend (comme toujours) de lefficacit.

Utilisations

La classe View du Model/View/Controller de Smalltalk tait un Composite, Le framework de compilation de RTL Smalltalk utilisait abondamment le patron Composite.

Une expression RTL est une Component pour les arbres de drivation. Elle possde des sous-classes, comme BinaryExpression, qui contiennent des fils de type RTLExpression. Ces classes dfinissent une structure composite pour les arbres de drivation. RegisterTransfer est une classe Component pour la reprsentation des affectations de la forme Single Static Assignment (SSA) tel que

Affectation primitive qui effectue une opration sur deux registres et affecte le rsultat un troisime. Affectation avec un registre source mais sans registre destination, ce qui siginifie que le registre est utilis aprs le retour de la routine Une autre sous-classe, RegisterTransferSet, est une classe composite pour reprsenter les affectations qui modifient plusieurs registres en mme temps.

Un autre exemple de lutilisation de ce patron provient du domaine de la finance, un portfolio est un aggrgat de biens individuels.

Le portfolio est implment en tant que composantes respectant linterface des biens individuels.

Patrons de conception relis

Dans plusieurs cas, le lien entre une composante et son parent est utilis pour le patron de conception Chain of Responsibility. Le patron de conception Decorator est souvent utilis avec le patron Composite.

Lorsque les dcorateurs et les composites sont utiliss ensemble, ils possdent habituellement une superclasse commune.

Ainsi les dcorateurs devront supporter linterface Component et, partant, des oprations comme add, remove, et getChild.

Le patron de conception Flyweight permet de partager les composantes,

par contre ces dernires ne peuvent plus possder de rfrences sur leurs pres (alors multiples).

Le patron de conception Iterator peut tre utilis pour parcourir les composites.
Le patron de conception Visitor rend locaux les comportements et les oprations qui autrement seraient rpartis travers les classes Composite et Leaf.

Rfrences

Gamma et al., Design Patterns The Composite pattern and Struts Tiles

The Apache Struts framework includes a JSP tag library, known as Tiles, that lets you compose a Webpage from multiple JSPs. Tiles is actually an implementation of the J2EE (Java 2 Platform, Enterprise Edition) CompositeView pattern, itself based on the Design Patterns Composite pattern.

Java Design Patterns

http://www.javaworld.com/columns/jw-java-design-patterns-index.shtml A look at the Composite design pattern

Treat primitive and composite objects the same way http://www.javaworld.com/javaworld/jw-09-2002/jw-0913-designpatterns-p2.html

Web application components made easy with Composite View

Implement Web applications featuring pluggable components with the Composite View design pattern
http://www.javaworld.com/javaworld/jw-12-2001/jw-1228-jsptemplate.html

Decorator

Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.

Decorator - exemple

Flyweight

Use sharing to support large numbers of fine-grained objects efficiently.

Flyweight - exemple

Chain of responsibility

Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.

Chain of responsibility - exemple

Visitor

Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.

Visitor - exemple