Object-Oriented Design & Patterns

Cay S. Horstmann

Chapitre 10

Plus de patrons de conception

Matière du chapitre

Adaptateurs

Le patron ADAPTER

Contexte

  1. On veut utiliser la classe existante (adaptee) sans la modifier.
  2. Le contexte dans lequel on veut utiliser la classe demande une interface cible différente de "adaptee".
  3. L'interface cible et l'interface "adaptee" sont conceptuellement reliées.

Le patron ADAPTER

Solution

  1. Définir une classe adaptateur qui implémente l'interface cible.
  2. La classe adaptateur contient une référence vers "adaptee". Elle traduit les méthodes cibles vers les méthodes de "adaptee".
  3. Le client place ("wraps") l'objet adapté dans un objet de la classe adaptateur.

Le patron ADAPTER

.

Le patron ADAPTER

Nom dans le patron de conception
Vrai nom (Icon->Component)
Adaptee
Icon
Target
JComponent
Adapter
IconAdapter
Client
La classe qui veut ajouter les icônes au container
targetMethod()
paintComponent(), getPreferredSize()
adapteeMethod()
paintIcon(), getIconWidth(), getIconHeight()

Le patron ADAPTER

Le patron ADAPTER

Nom dans le patron de conception
Vrai nom (Stream->Reader)
Adaptee
InputStream
Target
Reader
Adapter
InputStreamReader
Client
La classe qui veut lire du texte provenant d'un input stream
targetMethod()
read (reading a character)
adapteeMethod()
read (reading a byte)

Actions d'un interface usager

Actions d'un interface usager


Le type interface Action

Le type interface Action

.

Exemple d'action

Le patron COMMAND

Contexte

  1. On veut implémenter des commandes qui se comportent comme des objets

Le patron COMMAND

Solution

  1. Définir un type interface "command" avec une méthode pour exécuter la commande.
  2. Fournir les méthodes dans le type interface "command" pour manipuler l'état des objets "command".
  3. Chaque classe concrète qui représente une commande implémente le type interface "command".
  4. Pour invoquer la commande, appeler la méthode d'exécution.

Le patron COMMAND

.

Le patron COMMAND

Nom dans le patron de conception
Vrai om (Swing actions)
Command
Action
ConcreteCommand
sous-classe de AbstractAction
execute()
actionPerformed()
state
nom et icône

Méthodes de fabrique (Factory methods)

Le patron FACTORY METHOD

Contexte

  1. Le type (le créateur) crée les objets pour un autre type (le produit).
  2. Les sous-classes du type créateur ont besoin de créer différents types d'objets produit.
  3. Les clients n'ont pas à connaître le type exacte des objets produit.

Le patron FACTORY METHOD

Solution

  1. Définir un type créateur qui exprime la ressemblance de tous les créateurs.
  2. Définir un type produit qui exprime la ressemblance de tous les produits.
  3. Définir une méthode, appelée la méthode fabrique (factory method), dans le type créateur.
    La méthode fabrique (factory method) permet d'obtenir un objet produit.
  4. Chaque classe concrète créateur implémente la méthode fabrique qui retourne un objet de la classe concrète du produit.

Le patron FACTORY METHOD

.

Le patron FACTORY METHOD

Nom dans le patron de conception Vrai nom (iterator)
Creator
Collection
ConcreteCreator
Une sous-classe de Collection
factoryMethod()
iterator()
Product
Iterator
ConcreteProduct
Une sous-classe de Iterator (laquelle est souvent anonyme)

Pas une FACTORY METHOD

Proxies

Chargement différé d'une image



Chargement différé d'une image

Proxies

Le patron PROXY

Contexte

  1. Une classe (le sujet réel) fournit un service qui est spécifié par un type interface (le type du sujet)
  2. Il y a un besoin de modifier le service pour le rendre plus versatile.
  3. Le client et le sujet réel ne doivent pas être affectés par la modification.

Le patron PROXY

Solution

  1. Définir une classe proxy qui implémente le type interface sujet.
    Le proxy contient une référence sur le sujet réel, ou il s'est comment le localiser.
  2. Le client utilise l'objet proxy.
  3. Chaque méthode du proxy invoque la même méthode sur le sujet réel et fournit les modifications nécessaires.

Le patron PROXY

.

Le patron PROXY

Nom dans le patron de conception
Vrai nom (image proxy)
Subject
Icon
RealSubject
ImageIcon
Proxy
ImageProxy
request()
Les méthodes du type interface Icon
Client
JLabel

Les singletons

Générateur de nombres aléatoires singleton

public class SingleRandom
{
   private SingleRandom() { generator = new Random(); }
   public void setSeed(int seed) { generator.setSeed(seed); }
   public int nextInt() { return generator.nextInt(); }
   public static SingleRandom getInstance() { return instance; }
   private Random generator;
   private static SingleRandom instance = new SingleRandom();
}

Le patron SINGLETON

Contexte

  1. Tous les clients ont besoin d'accéder la seule instance partagée d'une classe.
  2. On veut s'assurer qu'aucune autre instance ne peut être créée accidentellement.

Le patron SINGLETON

Solution

  1. Définir une classe avec un constructeur privé.
  2. La classe construit une seule instance d'elle-même.
  3. Fournir une méthode qui retourne une référence de la seule instance.

Pas un SINGLETON

Les hiérarchies inflexibles

Les hiérarchies inflexibles

.

Les visiteurs

Les visiteurs

Les visiteurs

Répartition double

Exemple de visiteur

Exemple de visiteur

.

Exemple de visiteur

Exemple de visiteur

Exemple de répartition double

Exemple de répartition double

.

Le patron VISITOR

Contexte

  1. Une structure d'objet contient des éléments de classe de plusieurs types, et on veut accéder aux opérations qui dépendent du type des objets.
  2. L'ensemble des opérations doit être extensible dans le temps.
  3. L'ensemble des éléments de classe est fixe.

Le patron VISITOR

Solution

  1. Définir un type interface "visitor" qui a des méthodes pour visiter les éléments de tous les types donnés.
  2. Chaque élément de classe définit une méthode "accept" qui invoque la bonne méthode sur le paramètre du visiteur.
  3. Pour implémenter une opération, définir une classe qui implémente le type interface "visitor" et fournit les actions des opérations pour chaque type d'élément.

Le patron VISITOR

.

Le patron VISITOR

Nom dans le patron de conception Vrai nom (file system visitor)
Element
FileSystemNode
ConcreteElement
FileNode, DirectoryNode
Visitor
FileSystemVisitor
ConcreteVisitor
PrintVisitor

D'autres patrons de conception

Conclusion : Qu'avez-vous appris

  1. Conception orientée object
    La méthodologie de conception
    Cartes CRC et diagramme UML
    Patrons de conception
  2. Java avancé
    Types Interface, polymorphisme et héritage
    Classes imbriquées
    Introspection  
    Multithreading  
    Collections
  3. Programme d'interface usager
    Construire des applications Swing
    Gestion des évènements
    Programmation de graphiques