A31 - Conception et programmation objet avancées

2 - Patrons de structure du GoF

Adrien Krähenbühl IUT Robert Schuman

Trois types de patrons

Les patrons de création
décrivent comment instancier les classes, c’est-à-dire comment créer et configurer des objets.
Les patrons de structure
décrivent comment structurer les classes afin d’avoir un minimum de dépendances entre l’implémentation et l’utilisation.
Les patrons de comportement
décrivent une structure de classes permettant de faire collaborer des objets efficacement.

Les 23 patrons

Facade

Facade - le problème

Problème
Comment faciliter l’utilisation complexe d’une classe ou d’un ensemble de classes à un “client” ?

Le client peut être une autre classe de la même application ou une classe d’une autre application.

Facade - la solution

Solution
Créer une classe intermédiaire entre les classes complexes et le client.
Conséquences
  • Du point de vue du client, cette classe additionnelle joue le rôle de facade entre lui et les classes complexes.
  • La complexité est encapsulée dans la facade.

Decorator

Decorator - le problème

Problème
Comment gérer les multiples combinaisons de comportements d’objets du même type statique ?

Decorator - la solution

Solution
Créer une classe “décoratrice” qui possède une instance et hérite de la super-classe afin d’isoler chaque comportement combinable dans l’une de ses sous-classes.

Decorator - les conséquences

  • Il est facile de réaliser n’importe quelle combinaison des classes filles de la classe décoratrice.
  • Il faut nécessairement avoir au moins une classe concrète qui hérite de la super-classe.
  • Il est très facile d’ajouter un nouveau comportement possible à un type d’objets.


Le design pattern Decorator permet d’étendre dynamiquement
(i.e. à l’exécution) le comportement d’un objet :

Pizza maCommande = new PizzaJambon(new PizzaMozza(new BaseTomate()));
// Zut, la commande n'était pas la bonne, j'ai oublié les ananas... :(
// Ouf, je peux les ajouter en une seule ligne !
maCommande = new PizzaAnanas(maCommande);

Composite

Composite - le problème

Comment représenter une structure arborescente pour permette de manipuler les éléments “feuilles” ET les éléments “composés” de façon uniforme ?


Structure Éléments composés Éléments feuilles
Un document HTML Entités HTML Texte
Un système de fichiers Répertoires Fichiers
Un arbre généalogique Personnes avec descendants Personnes sans descendant

Composite - la solution

Solution
  1. Définir une classe abstraite de composants qui déclare les opérations possibles de n’importe quel élément de la structure arborescente.
  2. Définir une classe qui représente les feuilles de la structure.
  3. Définir une classe qui représente les éléments composés d’autres éléments de la structure.

Composite - les conséquences

public static void main(String args) {
    Person shmi = new Ancestor("Schmi Skywalker");
    Person anakin = new Ancestor("Anakin Skywalker");
    Person luke = new LastDescendant("Luke Skywalker");
    ((Ancestor)shmi).addChild(anakin);
    ((Ancestor)anakin).addChild(luke);
    System.out.println(shmi.getAllDesendantNames());
}
  • Pour ajouter une nouvelle fonctionnalité à la structure arborescente, on déclare une méthode abstraite dans le composant.
  • Les méthodes abstraites d’un composant sont implémentées de manière RÉCURSIVE dans la classe composée.
  • Pour construire la structure arborescente, la classe composée doit proposer une méthode d’ajout d’enfants.
  • Il peut y avoir plusieurs classes feuilles

Quelques liens utiles

À lire avant toute chose
C’est quoi être professionnel quand on est développeur ?
SOLID et GRASP
Patrons du GoF
Autres