Object-Oriented Design & Patterns

Cay S. Horstmann

Chapitre 5

Patrons et Programmation d'interface utilisateur

Matière du chapitre

Itérateurs de liste

LinkedList<String> list = . . .;
ListIterator<String> iterator = list.listIterator();
while (iterator.hasNext())
{
String current = iterator.next();
. . .
}

Structure de données classique (liste)

Survol des structures de données

Liste avec curseur

.

for (list.reset(); list.hasNext(); list.next())
{
Object x = list.get();
. . .
}

Concept de patron

Patron "Passages courts"

.

Patron "Passages courts"

Contexte

"... les longs, stériles couloirs ont préparé le terrain pour tout ce qui est mauvais au sujet de l'architecture moderne..."

Problème

une description détaillée du problème, comprenant

Patron "Passages courts"

Solution

Garder les passages courts. Les construire comme des pièces autant possible, avec des tapis ou du bois par terre, des meubles, des étagères à livres, des belles fenêtres. Les rendre spacieux et bien éclairés. Les meilleurs couloirs sont ceux avec des fenêtres tout au long d'un mur.


.

Patron Itérateur

Contexte

  1. un agrégat est composé de plusieurs objets élémentaires
  2. des clients ont besoin d'accéder aux objets élémentaires
  3. l'agrégat ne devrait pas révéler sa structure interne
  4. de multiples clients pourraient désirer des accès indépendants

Patron Itérateur

Solution

  1. Définir un itérateur qui extrait un élément à la fois
  2. Chaque itérateur tient compte de la position du prochain élément
  3. S'il y a plusieurs variantes d'agrégats et d'itérateur, il vaut mieux que les classes d'agrégat et d'itérateur réalisent des interfaces communes.

Patron Itérateur

.

Patron Itérateur

Nom dans le patron de conception
Vrai nom (liste chaînée)
Aggregate
List
ConcreteAggregate
LinkedList
Iterator
ListIterator
ConcreteIterator
classe anonyme implémentant ListIterator
createIterator()
listIterator()
next()
next()
isDone()
inverse de hasNext()
currentItem()
valeur de retour de next()


Modèle/Vue/Contrôleur

Modèle/Vue/Contrôleur



Modèle/Vue/Contrôleur

Modèle/Vue/Contrôleur

Modèle/Vue/Contrôleur


.

Patron Observateur

Patron Observateur

Contexte

  1. Un objet, nommé le sujet, est une source d'évènements
  2. Un ou plusieurs observateurs s'intéressent à ces évènements et voudraient être avertis à l'arrivée d'un tel évènement

Solution

  1. Définir un type interface observateur (observer). Tout observateur concret l'implémente.
  2. Le sujet gère une collection d'observateurs.
  3. Le sujet fournit des méthodes pour ajouter ou enlever des observateurs.
  4. Lorsqu'un évènement arrive, le sujet avertit tous les observateurs dans la collection.

Patron Observateur

.

Noms dans le patron Observateur

Nom dans le patron de conception
Vrai nom (Boutons Swing)
Subject
JButton
Observer
ActionListener
ConcreteObserver
la classe implémentant l'interface ActionListener
attach()
addActionListener()
notify() actionPerformed()

Layout Managers (Gestionnaire de disposition)

Layout Managers

Layout Managers

.

Layout Managers

Layout Managers

.

Interface utilisateur pour un système de boîte vocale

Interface utilisateur pour un système de boîte vocale

. 

Interface utilisateur pour un système de boîte vocale

Interface utilisateur pour un système de boîte vocale

.

Interface utilisateur pour un système de boîte vocale

.

Gestionnaires de disposition personnalisés


Interface LayoutManager

public interface LayoutManager 
{
void layoutContainer(Container parent);
Dimension minimumLayoutSize(Container parent);
Dimension preferredLayoutSize(Container parent);
void addLayoutComponent(String name, Component comp);
void removeLayoutComponent(Component comp);
}

Disposition de formulaire (Form Layout)

Patron Stratégie

Patron Stratégie

Contexte

  1. Une classe peut bénéficier des variantes différentes d'un algorithme
  2. Les clients veulent parfois remplacer l'algorithme standard avec des versions personnalisées

Solution

  1. Définir une interface étant une abstraction de l'algorithme
  2. Des classes concrètes stratégie implémentent cette interface
  3. Les clients peuvent fournir des objets stratégie
  4. Lorsque l'algorithme doit être exécuté, la classe contexte appelle aux méthodes appropriées de l'objet stratégie

Patron Stratégie

.

Patron Stratégie: Disposition     

Nom dans le patron de conception Vrai nom (gestion de disposition)
Context
Container
Strategy
LayoutManager
ConcreteStrategy
un gestionnaire de disposition, comme BorderLayout
doWork()
une méthode, comme layoutContainer

Patron Stratégie: Tri

Nom dans le patron de conception Vrai nom (tri)
Context
Collections
Strategy
Comparator
ConcreteStrategy
une classe implémentant Comparator
doWork()
compare

Containers et Components

Patron Composite

Contexte

  1. Objets primitifs peuvent être combinés en objets composites
  2. Les clients utilisent un objet composite comme un objet primitif

Solution

  1. Définir une interface étant une abstraction des objets primitifs
  2. L'objet composite amasse des objets primitifs
  3. Des classes composite et primitifs implémentent la même interface.
  4. Lorsqu'il implémente une méthode de l'interface, l'objet composite applique la méthode à ces objets primitifs et il combine les résultats.

Patron Composite

.

Patron Composite

Nom dans le patron de conception Vrai nom (AWT components)
Primitive
Component
Composite
Container
Leaf
un composant sans enfant (p. ex. JButton)
method()
une méthode de Component (p. ex. getPreferredSize)

Barres de défilement (Scroll Bars)


Barres de défilement (Scroll Bars)

.

Patron Décorateur

Contexte

  1. Objets composant peuvent avoir de la décoration, soit visuelle, soit comportementale
  2. L'objet décoré peut être utilisé de la même façon que l'objet non décoré
  3. La classe composant ne veut pas prendre la responsabilité de faire la décoration
  4. Il peut y avoir un nombre illimité de possibilités de décorations

Patron Décorateur

Solution

  1. Définir une interface étant une abstraction du composant
  2. Des classes concrètes composant réalisent cette interface
  3. Des classes décoratrices implémentent également cette interface
  4. Un objet décorateur gère l'objet composant pour lequel il fait la décoration
  5. Lorsqu'il implémente une méthode de l'interface, la classe décoratrice applique la méthode à l'objet pour lequel il fait la décoration et il ajoute au résultat pour atteindre l'effet de la décoration.

Patron Décorateur

.

Patron Décorateur: Barres de défilement

Nom dans le patron de conception Vrai nom (barres de défilement)
Component Component
ConcreteComponent JTextArea
Decorator JScrollPane
method()
une méthode de Component (p. ex. paint)

Flux de données (Streams)

InputStreamReader reader = new InputStreamReader(System.in); 
BufferedReader console = new BufferedReader(reader);

Patron Décorateur Pattern: Input Streams

Nom dans le patron de conception
Vrai nom (input streams)
Component Reader
ConcreteComponent InputStreamReader
Decorator BufferedReader
method()
read

Comment reconnaître les patrons

Révélateur (Litmus Test)


Révélateur (Litmus Test)

  1. Objets composant peuvent avoir de la décoration (visuelle ou comportementale)
    OUI
  2. L'objet décoré peut être utilisé de la même façon que l'objet non décoré.
    OUI
  3. La classe composant ne veut pas prendre la responsabilité de faire la décoration
    NON--la classe composant possède une méthode setBorder
  4. Il peut y avoir un nombre illimité de possibilités de décorations

Appliquer les patrons

Ensembles (Bundles)

Ensembles (Bundles)

.

Articles escomptés

Articles escomptés

.

Séparation Modèle/Vue

Change Listeners

Change Listeners

Observer la facture (Invoice)

.

Itérer à travers les articles de la facture

Itérateurs

Itérateurs

.

Mise en pages des factures

Mise en page des factures

Mise en page des factures

.

Mise en page des factures

.