Vous êtes sur la page 1sur 26

Cours 1 : Introduction aux patrons

jean-michel Douin, douin au cnam point fr


version : 3 Septembre 2009

Notes de cours,
elles ne remplacent la lecture douvrages ou de tutoriels sur ce sujet cf. bibliographie

ESIEE

Sommaire

Conception laide de patrons (design pattern).


BlueJ : www.patterncoder.org

ESIEE

Page 1

Principale bibliographie utilise pour ces notes


[Grand00]
Patterns in Java le volume 1

http://www.mindspring.com/~mgrand/

[head First]
Head first : http://www.oreilly.com/catalog/hfdesignpat/#top

[DP05]
Lextension Design Pattern de BlueJ : http://hamilton.bell.ac.uk/designpatterns/

Ou bien en http://www.patterncoder.org/

[Liskov]
Program Development in Java,
Abstraction, Specification, and Object-Oriented Design, B.Liskov avec J. Guttag
Addison Wesley 2000. ISBN 0-201-65768-6

[divers]
Certains diagrammes UML : http://www.dofactory.com/Patterns/PatternProxy.aspx
informations gnrales http://www.edlin.org/cs/patterns.html
3

ESIEE

Java : les objectifs, rappel

Simple
sr
Orient Objet
Robuste
Indpendant d une architecture
Environnement riche
Technologie Transversale

un langage de programmation
4

ESIEE

Page 2

Design Pattern
En quelques mots

Moyen daccomplir quelque chose


Une mthode prouve, rutilise
Un code simple, propre et peu perfectible
Un jargon pour discuter du savoir faire
intra discipline
5

ESIEE

Pattern pourquoi ?
Patterns ou Modles de conception rutilisables
Un modle == plusieurs classes == Un nom de Pattern
-> Assemblage de classes pour un discours plus clair

Les librairies standard utilisent ces Patterns

LAPI AWT utilise le patron/pattern composite ???


Les vnements de Java utilisent le patron Observateur ???

etc.

Une application = un assemblage de plusieurs patterns


Un rve ?
6

ESIEE

Page 3

La bibliothque graphique du JDK utilise un composite ?


Le pattern Composite ?, usage dun moteur de recherche sur le web

ESIEE

la bibliothque graphique utilise bien un Composite :


java.awt.Component java.awt.Button java.awt.Container

Component

Label

Button

Container

ESIEE

Page 4

la place de

ESIEE

Pattern Patrons, sommaire


Historique
Classification
Les fondamentaux
Quelques patrons en avant-premire
Adapter, Proxy

10

ESIEE

Page 5

Patrons/Patterns pour le logiciel


Origine C. Alexander un architecte
1977, un langage de patrons pour l architecture 250 patrons

Abstraction dans la conception du logiciel


[GoF95] la bande des 4 : Gamma, Helm, Johnson et Vlissides
23 patrons/patterns

Une communaut
PLoP Pattern Languages of Programs
http://hillside.net

11

ESIEE

Introduction
Classification habituelle
Crateurs
Abstract Factory, Builder, Factory Method Prototype Singleton

Structurels

Adapter Bridge Composite Decorator Facade Flyweight Proxy

Comportementaux
Chain of Responsability. Command Interpreter Iterator
Mediator Memento Observer State
Strategy Template Method Visitor

12

ESIEE

Page 6

Patron dfini par J. Coplien


Un pattern est une rgle en trois parties exprimant une relation entre
un contexte, un problme et une solution ( Alexander)

13

ESIEE

Dfinition d un patron
Contexte
Problme
Solution
Patterns

and software :

Essential Concepts and Terminology par Brad Appleton


http://www.cmcrossroads.com/bradapp/docs/patterns-intro.html

Diffrentes catgories

Conception (Gof)
Architecturaux(POSA/GoV, POSA2 [Sch06])
Organisationnels (Coplien www.ambysoft.com/processPatternsPage.html)
Pdagogiques(http://www.pedagogicalpatterns.org/)

14

ESIEE

Page 7

Les fondamentaux [Grand00] avant tout


Constructions
Delegation
Interface
Abstract superclass
Immutable
Marker interface

15

ESIEE

Delegation
Ajout de fonctionnalits une classe

Par lusage dune instance dune classe


Une instance inconnue du client

Gains
Couplage plus faible
Slection plus fine des fonctionnalits souhaites

16

ESIEE

Page 8

Delegation : un exemple classique


import java.util.Stack;
public class Pile<T>{
private final Stack<T> stk;
public Pile(){
stk = new Stack<T>();
}
public void empiler(T t){
stk.push(t);
}
}
public class Client{
public void main(String[] arg){
Pile<Integer> p = new Pile<Integer>();
p.empiler(4);
}}
17

ESIEE

Delegation : souplesse Client inchang


import java.util.List;
import java.util.LinkedList;

public class Pile<T>{


private final List<T> stk;
public Pile(){
stk = new LinkedList<T>();
}
public void empiler(T t){
stk.addLast(t);
}
}
public class Client{
public void main(String[] arg){
Pile<Integer> p = new Pile<Integer>();
p.empiler(4);
}}
18

ESIEE

Page 9

Dlgation / Hritage
Petite discussion

Avantages/inconvnients
Dlgation prfre

mais
19

ESIEE

Dlgation : une critique

public class Pile<T>{


private final List<T> stk;

Lutilisateur
na pas le choix de
limplmentation de la Liste

public Pile(){
stk = new LinkedList<T>();
}
}

20

ESIEE

Page 10

Interface
La liste des mthodes respecter
Les mthodes quune classe devra implmenter
Plusieurs classes peuvent implmenter une mme interface
Le client choisira une implmentation en fonction de ses besoins

Exemple
Collection<T> est une interface
ArrayList<T>, LinkedList<T> sont des implmentations de Collection<T>

Iterable<T> est une interface


Linterface Collection extends cette interface et propose la mthode
public Iterator<T> iterator();
21

ESIEE

Interface : java.util.Iterator<E>
interface Iterator<E>{
E next();
boolean hasNext();
void remove();
}
Exemple :
Afficher le contenu dune Collection<E> nomme collection
Iterator<E> it = collection.iterator();
while( it.hasNext()){
System.out.println(it.next());
}
22

ESIEE

Page 11

Usage des interfaces

un filtre : si la condition est satisfaite alors retirer cet lment


public static
<T> void filtrer( Collection<T> collection,
Condition<T> condition){
Iterator<T> it = collection.iterator();
while (it.hasNext()) {
T t = it.next();
if (condition.isTrue(t)) {
it.remove();
}
}

Collection et Condition
sont des interfaces

}
public interface Condition<T>{
public boolean isTrue(T t);
}

discussion

23

ESIEE

Exemple suite
Usage de la mthode filtrer
retrait de tous les nombres pairs dune liste dentiers

Collection<Integer> liste = new ArrayList<Integer>();


liste.add(3);liste.add(4);liste.add(8);liste.add(3);
System.out.println("liste : " + liste);
Utile.filtrer(liste,new EstPair());
System.out.println("liste : " + liste);

24

ESIEE

Page 12

Exemple suite bis


Usage de la mthode filtrer
retrait de tous les tudiants laide dune expression rgulire

Collection<Etudiant> set = new HashSet<Etudiant>();


set.add(new Etudiant("paul"));
set.add(new Etudiant("pierre"));
set.add(new Etudiant("juan"));
System.out.println("set : " + set);
Utile.filtrer(set,new Regex("p[a-z]+"));
System.out.println("set : " + set);

discussion
25

ESIEE

Dlgation : une critique, bis


public class Pile<T>{
Lutilisateur
na pas le choix de
limplmentation

private final List<T> stk;


public Pile(){
stk = new LinkedList<T>();
}
}

public class Pile<T>{


private final List<T> stk;
public
stk =
}
public
stk =
}
}

Ici lutilisateur
a le choix de
limplmentation de la Liste

Pile(List<T> l){
l;
Pile(){
new LinkedList<T>();

26

ESIEE

Page 13

Vocabulaire : Injection de dpendance


Dlgation + interface = injection de dpendance
Voir Martin Fowler
Inversion of Control Containers and the Dependency Injection pattern
http://martinfowler.com/articles/injection.html

Linjection de dpendance est effectue la cration de la pile


Voir le paragraphe Forms of Dependency Injection
27

ESIEE

Dlgation : une critique de critique


public class Pile<T>{
private final List<T> stk;
Ici lutilisateur
a le choix de
limplmentation de la Liste

public Pile(List<T> l){


stk = l;
}}

Mais rien nempche ici une utilisation malheureuse de l lextrieur de Pile


List<String> l = new LinkedList<String>();

// correct

Pile<String> p = new Pile(l);


p.empiler("ok");

// idem
// idem
// attention

l.add("attention");
// tat de la pile ?

Une solution ? Satisfaisante ?


28

ESIEE

Page 14

Abstract superclass
Construction frquemment associe lInterface
Une classe propose une implmentation incomplte
abstract class en Java

Apporte une garantie du bon fonctionnement pour ses sous-classes


Une sous-classe doit tre propose
Souvent lie limplmentation dune interface
Exemple extrait de java.util :
abstractCollection<T> propose 13 mthodes sur 15
et implmente Collection<T>
29

ESIEE

Abstract superclass exemple


java.util.Collection un extrait

30

ESIEE

Page 15

Immutable
La classe, ses instances ne peuvent changer dtat
Une modification engendre une nouvelle instance de la classe

Robustesse attendue

Partage de ressource facilite


Exclusion mutuelle nest pas ncessaire

java.lang.String est Immutable


Contrairement java.lang.StringBuffer

31

ESIEE

Immutable : exemple
public class Pile<T>{
private final Stack<T> stk;
public Pile(){
stk = new Stack<T>();
}
public Pile<T> empiler(T t){
Pile<T> p = new Pile<T>();
p.stk.addAll(this.stk);
p.stk.push(t);
return p;
}
public T sommet(){
return stk.peek();
}

32

ESIEE

Page 16

Marker Interface
Une interface vide !
Classification fine des objets
implements installe sciemment par le programmeur

Exemples clbres
java.io.Serializable, java.io.Cloneable
Lors de lusage dune mthode particulire une exception sera leve si
cette instance nest pas du bon type
Note : Les annotations de Java peuvent remplacer lgamment cette notion

33

ESIEE

Marker Interface : exemple


public interface Immutable{}
public class NotImmutableException
extends RuntimeException{
public NotImmutableException(){super();}
public NotImmutableException(String msg){super(msg);}
}
public class Pile<T> implements Immutable{
...
}

Pile<Integer> p = new Pile<Integer>();


if(!(p instanceOf Immutable))
throw new NotImmutableException();

34

ESIEE

Page 17

Interface & abstract

Avantages cumuls !
Collection<T> interface
AbstractCollection<T>
ArrayList<T>
35

ESIEE

Interface & abstract

Dj vu
36

ESIEE

Page 18

Les 23 patrons
Classification habituelle
Crateurs
Abstract Factory, Builder, Factory Method Prototype Singleton

Structurels
Adapter Bridge Composite Decorator Facade Flyweight Proxy
Comportementaux
Chain of Responsability. Command Interpreter Iterator
Mediator Memento Observer State
Strategy Template Method Visitor

37

ESIEE

Deux patrons pour lexemple

Dans la famille Patrons Structurels

Adapter
Adapte linterface dune classe afin dtre conforme aux souhaits du client

Proxy
Fournit un mandataire au client afin de contrler/vrifier ses accs

38

ESIEE

Page 19

Adaptateurs : exemples

Adaptateurs
- prise US/ adaptateur / prise EU
- Pritel / adaptateur / RCA
39

ESIEE

Adaptateur exemple : Pritel RCA


Ce que nous avons : RCA
public interface Plug {
public void RCA();
}

Ce que le client souhaite : une prise Pritel


public interface Prise {
public void pritel();
}
Il faut sadapter aux souhaits du client
40

ESIEE

Page 20

Adaptateur (implements Prise)


public class Adaptateur implements Prise {
public Plug adapt;
public Adaptateur(Plug adapt){
this.adapt = adapt;
}
public void pritel(){
adapt.RCA();
}
}

41

ESIEE

Adaptateur : Le client est satisfait


public class UnClient {
Prise prise = new Adaptateur(new PlugRCA());
prise.pritel(); // satisfait
}

public class PlugRCA implements Plug {


public void RCA(){ .}
}
42

ESIEE

Page 21

Pattern Adapter [DP05]

DP05 ou www.patterncoder.org, un plug-in de bluej


43

ESIEE

Pattern Adapter [DP05]


public interface Target {
public void serviceA();
}
public class Adaptee {
public void serviceB(){}
}

[DP05]

public class Adapter implements Target {


public Adaptee adaptee;
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
public void serviceA(){
adaptee.serviceB();
}
}
44

ESIEE

Page 22

Adapter et classe interne java


Souvent employ
public Target newAdapter(final Adaptee adaptee){
return
new Target(){
public void serviceA(){
adaptee.serviceB();
}
};
}

Un classique
w.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
45

ESIEE

Une question dun examen de lesiee

46

ESIEE

Page 23

Pattern Proxy
Fournit un mandataire au client afin de
Contrler/vrifier les accs

47

ESIEE

Proxy : un exemple

public abstract class AbstractLogon{


abstract public boolean authenticate( String user, String password);
}
public class Client{
public static void main(String[] args){
AbstractLogon logon = new ProxyLogon();

}
}
48

ESIEE

Page 24

Proxy : exemple suite

public class ProxyLogon extends AbstractLogon{


private AbstractLogon real = new RealLogon();
public boolean authenticate(String user, String password){
if(user.equals("root") && password.equals("java"))
return real.authenticate(user, password);
else
return false;
}
}

public class RealLogon extends AbstractLogon{


public boolean authenticate(String user, String password){
return true;
}
}
49

ESIEE

Adapter\Proxy
discussion

50

ESIEE

Page 25

Conclusion
Est-ce bien utile ?
Architecture dcrite par les patterns ?
Langage de patterns ?
Comment choisir ?
Trop de Patterns ?
Mthodologie dun AGL ?

51

ESIEE

BlueJ : www.patterncoder.org

Dmonstration : le patron Adapter


52

ESIEE

Page 26