Template Method - Laurent Henocque
Template Method - Laurent Henocque
Template Method - Laurent Henocque
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Design Patterns<br />
<strong>Laurent</strong> <strong>Henocque</strong><br />
http://laurent.henocque.free.fr/<br />
Enseignant Chercheur ESIL/INFO France<br />
http://laurent.henocque.perso.esil.univmed.fr/<br />
mis à jour en Septembre 2009
Licence Creative Commons<br />
Cette création est mise à disposition selon le Contrat<br />
Paternité-Partage des Conditions Initiales à<br />
l'Identique 2.0 France disponible en ligne<br />
http://creativecommons.org/licenses/by-sa/2.0/fr/<br />
ou par courrier postal à Creative Commons, 559<br />
Nathan Abbott Way, Stanford, California 94305,<br />
USA.
Préambule<br />
• Ce support de cours présente de nombreux<br />
diagrammes, dont certains peuvent contenir des<br />
erreurs UML2<br />
• Il n'est donc pas utilisable sans l'aide d'un<br />
enseignant
Objectifs pédagogiques<br />
• Permettre, en découvrant les design patterns, de<br />
maîtriser totalement les diagrammes de classes<br />
• Pré-requis pour l’étude des spécifications UML<br />
• C’est un cours d’apprentissage de l’agilité à<br />
comprendre et formuler des modèles abstraits
Contexte<br />
• De très nombreux projets logiciels font apparaître des<br />
éléments comparables<br />
• Réinventer les meilleures solutions connues dans chaque<br />
nouveau projet est inutile, et risqué<br />
• Analysis Patterns<br />
• Design Patterns<br />
• Frameworks<br />
• Workflow Patterns
Pourquoi les Patterns<br />
• La réussite prime sur la nouveauté<br />
• Importance de la clarté de la documentation<br />
• Validation qualitative des acquis et de la<br />
connaissance pratique<br />
• Importance de la dimension humaine dans le<br />
développement logiciel<br />
• Faciliter la réutilisation de savoir faire
Sur la réutilisation<br />
Les langages informatiques modernes orientés objet<br />
permettent la réutilisation<br />
• par la réutilisation d’interfaces (mixin)<br />
• par importation de classes<br />
• par héritage : extension / spécialisation<br />
• par l'inversion de contrôle<br />
• par les aspects<br />
• par les architectures à plugins, etc...
Les patterns c'est quoi?<br />
Design Pattern<br />
=<br />
Schéma de conception réutilisable<br />
=<br />
Organisation et hiérarchie de plusieurs modèles de<br />
classes réutilisable par simple implémentation,<br />
adaptation, extension
Comment?<br />
• Les Design Patterns sont présentés en utilisant la<br />
notation graphique standard UML<br />
• Pour l'essentiel, seule la partie statique<br />
(diagrammes de classes) de UML est utilisée
Diagrammes de Classes UML2<br />
(éléments)<br />
Classe_A<br />
relation<br />
Classe_B<br />
héritage<br />
Classe_C<br />
attributs<br />
fonctions<br />
agrégat / composition<br />
Classe_D<br />
dépendance
Références
Références Web<br />
• http://patterndigest.com/<br />
• http://norvig.com/design-patterns<br />
• http://www.industriallogic.com/papers/<br />
index.html<br />
• … google…
Exemples Simples : Intuition<br />
Quelques exemples de "proto" patterns, ou<br />
d'éléments de conception réutilisables non<br />
officialisés
La Liste<br />
• La liste (ce n'est pas un schéma, mais un<br />
élément de conception orientée objet)<br />
Ce modèle est largement criticable : quels sont ses<br />
défauts?
Collection<br />
Gestion de collections via une classe<br />
Ce modèle ne respecte pas les conventions UML:<br />
quels sont ses défauts?
Attribut Relation<br />
• Définir un rôle d'une relation (binaire) par un<br />
pointeur
Maître / Esclave<br />
• Déléguer la gestion d'une relation à une classe<br />
intermédiaire
Objet Relation<br />
• Modéliser une relation importante par un objet<br />
(on veut ignorer la façon dont la relation est<br />
gérée)
Le “Méga Pattern MVC”<br />
Model View Controller, au coeur de tous les<br />
frameworks web: J2EE/Struts/... (Java), Ruby on<br />
Rails, Code Ignitor,Yii (php)...
Model View Controller
Model View Controller<br />
MVC peut être vu comme une combinaison de design patterns<br />
• Les vues sont organisées selon Composite<br />
• Le lien entre vues et modèles est l' Observer.<br />
• Les contrôleurs sont des Strategy attachées aux vues.<br />
MVC peut mettre en jeu encore d'autres patterns:<br />
• Le modèle est souvent un Mediator<br />
• Les arbres de vues mettent en œuvre Decorator<br />
• On a souvent besoin d' Adapter pour convertir l'interface d'un Modèle de<br />
façon à ce qu'elle soit adaptée aux vues.
Document View Pattern<br />
• Document View est une version simplifiée de<br />
MVC où la vue agit selon le pattern Observer, et<br />
est mise à jour en fonction de l'état du document<br />
• (Mis en œuvre dans les MFC)
Emergence du Beau<br />
La modélisation objet a fait émerger de nouvelles<br />
constructions remarquables
Le Méta Méta Modèle noyau<br />
de UML<br />
• Ce diagramme auto-descriptif est une perfection<br />
ontologique
Le pattern Composite<br />
• Le plus petit diagramme décrivant un principe<br />
de portée générale
7 Design Patterns<br />
Fondamentaux
3 grandes catégories de<br />
Patterns<br />
• Patterns structuraux<br />
• décrivent une organisation de classes dans l'optique<br />
"structure de données"<br />
• Patterns de création<br />
• décrivent des approches de création déléguée d'objets<br />
• Patterns dynamiques<br />
• décrivent une organisation de classes gérant les aspects<br />
dynamiques d'un système
Un noyau de 7 Design<br />
Patterns Fondamentaux<br />
• On débute par 7 schémas d'utilisation très répandue<br />
• Composite<br />
• Iterator<br />
• Command<br />
• Adapter<br />
• Singleton<br />
• Factory <strong>Method</strong><br />
• <strong>Template</strong> <strong>Method</strong>
Composite<br />
Composer des structures de données récursives
Composite<br />
• Composer des structures de données récursives
Composite : exemples<br />
• Toute structure de données récursive<br />
• classes collections<br />
• conteneurs graphiques<br />
• structure de document (chapitre/section/<br />
paragraphe...)<br />
• container conceptuel (états composites dans les<br />
diagrammes d’état UML)
Analyse<br />
• Composite superpose :<br />
• une hiérarchie de types (taxonomie) et<br />
• une hiérarchie de conteneurs (partonomie).
Exercices<br />
• Définir une hiérarchie de classes récursive pour<br />
des interfaces homme machine (trois classes<br />
suffisent)<br />
• Définir un modèle pour des expressions<br />
arithmétiques
Iterator<br />
Parcourir des conteneurs en masquant<br />
l'implantation
Iterator<br />
• Parcourir des conteneurs en masquant<br />
l'implantation
Iterator<br />
• Un Pattern qui met en oeuvre une collaboration
Iterator : exemples<br />
• Toute logique de parcours de container<br />
• Exemples nombreux en Java<br />
• On veut enlever des structures de données toute<br />
information relative à son parcours, et ainsi<br />
permettre de faire varier les modes de parcours
Analyse<br />
• Itérator sépare la logique de l’itération dans un<br />
objet indépendant dont les états logiques et<br />
physiques correspondent.<br />
• Sert de nombreux impératifs de bonne<br />
conception (séparation, masquage, couplage<br />
faible)<br />
• Permet de définir des hiérarchies d’itérateurs
Itérator est un cas complexe<br />
• Une caractéristique fondamentale d’itérator<br />
consiste à déléguer la création au conteneur<br />
• Ce principe est isolé dans plusieurs patterns<br />
“créationaux”, dont “factory”
Exercices<br />
• Lister les différents services attendus des<br />
itérateurs<br />
• Définir un modèle compatible avec itérator pour<br />
deux classes liste et vecteur et deux itérateurs<br />
pour chacune d’elles
Command<br />
Encapsuler une requête dans un objet
Function Object<br />
• Encapsuler une fonction dans un objet<br />
• Les pointeurs de fonctions revisités dans<br />
un “proto” pattern<br />
FunctionObject<br />
_____________________<br />
execute(param)<br />
ConcreteFunctionObject<br />
_____________________<br />
state<br />
_____________________<br />
execute(param)
Command<br />
• Encapsuler une requête dans un objet
Command : exemples<br />
• Command remplace les pointeurs vers fonctions dans<br />
tous les langages objet évolués.<br />
• Command interface l'appel d'une opération via une<br />
méthode virtuelle.<br />
• Utilisé dans les interfaces homme machine pour<br />
attacher un comportement à un objet
Exercices<br />
• Imaginer une api pour mettre en place des<br />
callbacks dans une interface au moyen de<br />
«!command!»<br />
• Imaginer un mécanisme basé sur command<br />
permettant d’appeler une chaîne d’opérations<br />
automatiquement
(Class) Adapter<br />
Convertir une interface par héritage multiple
(Class) Adapter<br />
• Convertir une interface par héritage multiple
Adapter : exemples<br />
• Toute situation où l'on veut réutiliser du code,<br />
mais pas son interface de programmation.<br />
• Par exemple, dans le cas où un code ancien, ou<br />
tiers, ne respecte pas notre charte de<br />
présentation
Object Adapter (Wrapper)<br />
• Convertir une interface par composition<br />
• Variante d’adapter utilisable en l’absence<br />
d’héritage multiple
Exercice<br />
• Définir trois classes de formes géométriques<br />
indépendantes, et n’appartenant pas à une<br />
hiérarchie, puis définir une hiérarchie qui<br />
réutilise les précédentes par adaptation
Singleton<br />
Gérer une instance unique
Singleton<br />
• Gérer une instance unique<br />
Singleton<br />
---------------------------<br />
static instance()<br />
return uniqueInstance<br />
singletonOperation()<br />
getSingletonData()<br />
---------------------------<br />
static uniqueInstance<br />
singletonData
Singleton : exemples<br />
• Singleton permet de gérer la création à la<br />
demande (lazy) d'un objet unique.<br />
• L'objet est créé au premier accès de façon<br />
invisible<br />
• Exemples : le spooler d'impressions, le système<br />
de fichiers dans un OS
Exercice<br />
• Définir une classe singleton en Java, avec<br />
initialisation paresseuse (on ne crée l’unique<br />
instance qu’au moment du premier accès)<br />
• Id, mais avec une initialisation à priori
Factory <strong>Method</strong><br />
Définir une interface de création, mais laisser les<br />
sous classes décider du type
Factory <strong>Method</strong><br />
• Définir une interface de création, mais laisser les<br />
sous classes décider du type
Factory <strong>Method</strong> : exemples<br />
• C'est un fragment de Abstract Factory (voir plus loin)<br />
• C'est un exemple de "<strong>Template</strong> <strong>Method</strong>" (voir ci<br />
après)<br />
• Utile par exemple pour créer des itérateurs. Chaque<br />
classe d'une hiérarchie de containers implante sa<br />
version de "createIterator()", qui retourne un objet du<br />
type adéquat.
Exercice<br />
• Mettre en œuvre «!factory method!» dans le cas<br />
d’itérateurs, en prévoyant plusieurs classes de<br />
conteneurs et plusieurs catégories d’itérateurs
<strong>Template</strong> <strong>Method</strong><br />
Prévoir un squelette de fonction, et compléter<br />
par les sous classes
<strong>Template</strong> <strong>Method</strong><br />
• Prévoir un squelette de fonction, et<br />
compléter par les sous classes
Analyse<br />
• Il s’agit d’une sorte d’héritage inversé<br />
• Les sous classes héritent d’un algorithme<br />
générique, dont elles implantent les éléments<br />
spécifiques
<strong>Template</strong> method : exemple<br />
• La logique de création et archivage par nécessité suivante<br />
peut être définie par une super classe, et ses détails<br />
implantés par des sous classes<br />
Object get(String name){<br />
}<br />
Object o=find(name);<br />
if (o) return o;<br />
if (!canCreate(name)) return null;<br />
o = create(name);<br />
addToContainer(o);<br />
return o;
Exercice<br />
• Définir un exemple de template method<br />
• (une boucle «!for» avec deux appels de<br />
fonctions spécifiques)<br />
• <strong>Template</strong> method requiert de définir une classe<br />
pour chaque mise en œuvre. Peut on adapter l’<br />
exemple précédent de sorte qu’il utilise function<br />
object à la place?
Autres Schémas de<br />
Création<br />
Présentation quasi alphabétique
Schémas de Création<br />
• Abstract Factory :<br />
• interface de création de familles d'objets de type exact inconnu<br />
• Builder :<br />
• séparer création et représentation<br />
• Factory <strong>Method</strong> :<br />
• interface de création spécifiée par des sous classes<br />
• Prototype<br />
• création par clonage<br />
• Singleton<br />
• classe à instance unique
Abstract Factory<br />
• Interface de création de familles de produits
Abstract Factory : exemples<br />
• Permet de changer le look and feel d'une<br />
interface en changeant le type des objets créés en<br />
changeant simplement d'object factory<br />
• Peut aussi servir pour changer globalement les<br />
types de containers utilisés par un programme<br />
(listes ou tableaux ou hashtables) par exemple
Exercices<br />
• Définir une api permettant de changer de type<br />
de collection (basé sur les listes simples ou les<br />
tableaux ou les tableaux associatifs) simplement<br />
en changeant de container factory.<br />
• La collection doit seulement implanter l’accès<br />
aléatoire (valeur à une position «!i!»)
Builder<br />
• Séparer la construction d'un objet complexe de<br />
sa représentation
Builder : exemples<br />
• L'exemple type est celui d'un convertisseur "à la<br />
volée" de texte formaté.<br />
• vers un autre format<br />
• vers des formats avec perte (html -> texte seul)<br />
• Le principe est qu'à chaque rencontre d'une unité<br />
remarquable (balise, chaîne de caractères, texte<br />
libre...) le parseur invoque le convertisseur. En<br />
changeant ce dernier, on change le format de sortie.
Analyse<br />
• Selon le schéma «!Builder!», le «!director!» garde<br />
la maîtrise des appels au «!builder!».<br />
• La situation serait différente si la structure de<br />
données était parcourue automatiquement
Prototype<br />
• Créer des instances par clonage de prototypes
Prototype : exemples<br />
• C'est la base de la mise en œuvre du copier/<br />
coller dans les interfaces graphiques<br />
• La copie de prototype est au cœur de la<br />
simulation des classes en Javascript
Autres Schémas<br />
Structuraux<br />
Présentation alphabétique
Schémas Structuraux<br />
• Adapter<br />
– convertir une interface en une autre pour réutilisation<br />
• Bridge<br />
• découpler une abstraction de son implantation<br />
• Composite<br />
– structures arborescentes<br />
• Decorator<br />
• attachement dynamique de fonctionnalités<br />
• Façade<br />
• interface unique sur les interfaces d'un module<br />
• Flyweight<br />
• objets ultra légers<br />
• Proxy
Bridge<br />
• Découpler une abstraction de son implantation
Bridge : exemples<br />
• On se trouve dans le cas où l'on doit maintenir en<br />
même temps une hiérarchie d'abstractions et<br />
plusieurs hiérarchies d'implantation différentes : par<br />
exemple pour réaliser des interfaces graphiques<br />
portables<br />
• On peut aussi vouloir cacher des interfaces de<br />
programmation (C++) : cas particulier type de la<br />
classe "Handle"
Decorator<br />
• Attacher des fonctionnalités dynamiquement
Decorator : exemples<br />
• On veut attacher dynamiquement des traitements<br />
effectués de manière récursive<br />
• Exemple : dans les interfaces graphiques, l'affichage<br />
des "décorations" : barre de saisie, ascenseurs,<br />
transparence etc...<br />
• Autre possibilité : pour la sérialisation : ajout de<br />
balises html/xml autour du source généré par<br />
exemple.
Façade<br />
• Interfacer un sous système par une classe façade
Facade : exemples<br />
• Votre compilateur C++ en ligne de commande<br />
favori : permet l'invocation d'une session<br />
complète, ou du préprocesseur seul, ou du<br />
linker...
Flyweight<br />
• Gérer des millions de pseudo objets associés à<br />
des données de base
Flyweight exemples<br />
• Dans un éditeur de textes, faire de chaque<br />
caractère un objet.<br />
• Dans un afficheur de signaux radars, faire de<br />
chaque signal un objet.
Proxy<br />
• Définir un représentant local d'un objet<br />
accessible à distance
• interface des EJB<br />
Proxy : exemples
Autres schémas<br />
dynamiques<br />
Présentation alphabétique
Schémas Dynamiques<br />
• Chain of Responsibility<br />
• découpler l'objet responsable d'un traitement<br />
• Command<br />
– objet fonction<br />
• Interpreter<br />
• représentation de la sémantique d'une grammaire<br />
• Iterator<br />
– accès séquentiel au contenu d'un container<br />
• Mediator<br />
• modélisation de l'interaction d'objets<br />
• Memento<br />
• support du undo
Schémas Dynamiques<br />
• Observer<br />
• gestion des notifications<br />
• State<br />
• définir les états par des classes<br />
• Strategy<br />
• définir des familles d'algorithmes interchangeables<br />
• <strong>Template</strong> <strong>Method</strong><br />
– définir le squelette d'un algorithme<br />
• Visitor<br />
• permettre d'appliquer une opération aux éléments d'une structure de<br />
données
Chain of Responsibility<br />
• Eviter de coupler le demandeur d'une requête et<br />
son récepteur
exemples<br />
• le système de prise en compte des événements<br />
dans le logiciel hypercard<br />
• toute ihm ou l'on voudrait que par défaut un<br />
click s'il n'est pas traité par un bouton soit traité<br />
par un script d'un conteneur englobant, à un<br />
niveau quelconque
Interpreter<br />
• Explorer un arbre syntaxique
Interpreter : exemples<br />
• Utile pour la version "luxe" de "Builder". On a<br />
fait une analyse syntaxique, et on veut exploiter<br />
la structure de données hiérarchique qui a été<br />
construite pour:<br />
• compiler<br />
• traduire<br />
• ...
Mediator<br />
• Alléger le coût d'une communication nxn par un<br />
médiateur
Mediator
Mediator : exemples<br />
• Dans une interface graphique, gérer des<br />
dépendances complexes entre des composants<br />
de saisie/visualisation
Memento<br />
• Prévoir la restauration de l'état d'un objet (Undo)
Observer<br />
• Définir une relation entre objets pour que chaque<br />
mise à jour soit notifiée
Observer : exemples<br />
• Toujours dans une interface graphique par<br />
exemple, permettre la notification entre des vues<br />
multiples éditables ou non d'une même donnée.<br />
• Par exemple feuille de calcul/diagrammes
State<br />
• Gérer les états par une hiérarchie de classes
State : exemples<br />
• La fonction "display" d'une icône représentant<br />
une connexion change selon l'état.<br />
• Pour le code qui invoque display, il suffit de<br />
changer dynamiquement l'objet qui implémente<br />
l'état pour que cette particularité soit insensible
Strategy<br />
• Varier dynamiquement les algorithmes
Strategy : exemples<br />
• Les tris ont des plages d'optimalité.<br />
• On peut changer une fois pour toutes l'algo de<br />
tri attaché à un (itérateur de) vecteur par<br />
exemple, dès que le nombre de constituants<br />
dépasse 5<br />
• On remplace ainsi un test par un pointeur de<br />
fonction
Visitor<br />
• Explorer une structure de données hiérarchique
Visitor : exemples<br />
• permettre l'appel d'une fonction sur des<br />
éléments d'une structure de données sans avoir à<br />
réécrire l'algo de parcours à chaque fois.<br />
• la fonction "map" de LISP
Autres Patterns Utiles
Inversion de dépendance<br />
• L'inversion de dépendance permet de rendre un<br />
code indépendant de ses conditions<br />
d'initialisation , et des API précises des ses<br />
données d'initialisation<br />
• Utile dans les architectures multi couches<br />
• Exemple:<br />
• le framework Spring:<br />
• http://www.theserverside.com/tt/articles/<br />
article.tss?l=SpringFramework<br />
• le projet Pico (http://www.picocontainer.org/)<br />
• le projet Avalon
Inversion de Dépendance<br />
par les setters
Inversion de Dépendance<br />
par les constructeurs
GRASP<br />
General Responsibility Assignment Software<br />
Patterns or Principles
GRASP<br />
• GRASP propose des guides généraux<br />
d'organisation des interfaces de programmation<br />
orientée par le concept de "responsabilité"<br />
attachée aux classes.<br />
• Les "patterns" GRASP fournissent une canevas<br />
logique pour déployer des interfaces<br />
garantissant un niveau amélioré de réutilisabilité
Information Expert<br />
• Ce modèle représente le plus fondamental des<br />
allocations de responsabilité:<br />
• La responsabilité doit être attachée à la classe la<br />
plus compétente (Information Expert)
Creator<br />
• La classe responsable de créer de nouvelles<br />
instances d'une classe C est celle qui:<br />
• agrège, contient, enregistre les instances de C<br />
• utilise les instances de C<br />
• possède l'information nécessaire pour créer les<br />
C
Controller<br />
• La responsabilité de traiter les événements système<br />
est déléguée à une classe non membre de l'interface<br />
utilisateur qui représente le système entier ou un<br />
scénario de cas d'utilisation<br />
• Un contrôleur de use case doit être capable de gérer la<br />
totalité des événements possibles d'un cas<br />
d'utilisation.<br />
• Un contrôleur peut gérer les événements de plusieurs<br />
scénarios si nécessaire
Low Coupling<br />
• Le "couplage faible" renvoie aux aspects de<br />
l'organisation logicielle qui permettent:<br />
• de limiter les dépendances entre classes<br />
• de réduire l'impact du changement sur les autres classes<br />
• d'augmenter la réutilisabilité<br />
• Les stratégies qui le permettent sont variées, mais<br />
reposent largement sur l'inversion de contrôle et les<br />
design patterns de séparation (bridge, builder,<br />
decorator, mediator etc...)
High Cohesion<br />
• La "cohésion forte" est une stratégie<br />
d'organisation des classes qui vise à associer au<br />
sein d'une même classe des services fortement<br />
voisins ou reliés
Polymorphisme<br />
• Quand des variations de fonctionnalités sont<br />
induites par le type des objets, la responsabilité<br />
de ces variations est données à des sous classes<br />
qui implantent le type, à une opération<br />
surchargée dans chaque cas par la méthode<br />
appropriée
Pure Fabrication<br />
• Une "Pure Fabrication" est une classe ne faisant<br />
pas partie des objets métier ou technique, mais<br />
introduite pour les seuls besoins de satisfaire<br />
"low coupling et/ou high cohesion" ou tout<br />
autre besoin dicté par les GRASP
Indirection<br />
• Utiliser un intermédiaire (pattern Mediator par<br />
exemple) pour satisfaire les impératifs de<br />
couplage faible
Protected Variations<br />
• Protéger un ensemble logiciel des variations<br />
d'un élément en groupant ses parties instables<br />
dans une interface, dont les implantations<br />
réalisent les variations
Trois principes liés aux design et<br />
grasp patterns
Single-Responsibility<br />
Principle<br />
• Une classe doit n'avoir qu'une seule raison de<br />
changer.<br />
• Ce principe est une lecture du principe de "cohésion<br />
forte". La classe ne doit offrir que des services<br />
fortement reliés<br />
• on ne combine pas rémanence et fonctionnalité par<br />
exemple<br />
• Ce principe contredit de facto l'usage de l'héritage<br />
pour extension
Interface-Segregation<br />
Principle<br />
• Un programme ne doit pas dépendre de<br />
méthodes qu'il n'utilise pas<br />
• Principe également lié à la cohésion forte<br />
• Conduit à la multiplication d'interfaces très<br />
spécifiques et petites.
Open-Closed Principle<br />
• Un code doit être "ouvert à l'extension, mais fermé à<br />
la modification".<br />
• En d'autres termes, tout ajout de fonctionnalité ou<br />
évolution du logiciel doit se faire de façon<br />
incrémentale, sans modifier une ligne de source<br />
existante<br />
• Une approche de ce principe se fait par les design<br />
patterns "template method" et "strategy"!
Design Patterns J2EE
Les Patterns J2EE<br />
• Java a popularisé une liste de Patterns utilisés<br />
dans la mise en œuvre d'applications à base<br />
d'EJB<br />
Chaque Pattern n'est pas une collaboration au<br />
sens propre, mais le nom d'une classe, dotée de<br />
fonctionnalités particulières, et qui entre dans<br />
des interactions spécifiques avec d'autres
http://java.sun.com/blueprints/<br />
corej2eepatterns/Patterns/
http://java.sun.com/blueprints/<br />
corej2eepatterns/Patterns/
http://java.sun.com/blueprints/<br />
patterns/catalog.html<br />
• Business Delegate Reduce coupling between Web and Enterprise JavaBeansTM tiers<br />
• Composite Entity Model a network of related business entities<br />
• Composite View Separately manage layout and content of multiple composed views<br />
• Data Access Object (DAO) Abstract and encapsulate data access mechanisms<br />
• Fast Lane Reader Improve read performance of tabular data<br />
• Front Controller Centralize application request processing<br />
• Intercepting Filter Pre- and post-process application requests<br />
• Model-View-Controller Decouple data, behavior, and presentation<br />
• Service Locator Simplify client access to enterprise business services<br />
• Session Facade Coordinate operations between multiple business objects in a workflow<br />
• Transfer Object Transfer business data between tiers<br />
• Value List Handler Efficiently iterate a virtual list<br />
• View Helper Simplify access to model state and data access logic
Références<br />
• Mastering EJB 3.0<br />
• http://www.theserverside.com/tt/books/<br />
wiley/masteringEJB3/index.tss<br />
• EJB Design Patterns<br />
• http://www.theserverside.com/tt/books/<br />
wiley/EJBDesignPatterns/index.tss<br />
• L'ensemble du site est utile:<br />
• http://www.theserverside.com/
Conclusion<br />
Les patterns fournissent un outil puissant<br />
• de documentation de savoir-faire<br />
• de nommage de concepts universellement<br />
utilisés<br />
• de réutilisation pratique de modèles objet dans<br />
les projets
Autres Pseudo Patterns référencés
• Prédéfinir les casts<br />
Casting <strong>Method</strong>
Connected Group<br />
• Gérer collectivement les connexions
Double Checked Locking<br />
class Singleton {<br />
public:<br />
static Singleton * instance();<br />
private:<br />
static Singleton * self;<br />
static SEMAPHORE key;<br />
}<br />
Singleton *Singleton::instance() {<br />
if (self == 0) {<br />
if ( lock(key) >= 0 ) {<br />
if (self == 0 ); //double-check!<br />
self = new Singleton;<br />
unlock (key);<br />
} } }
Flexible Service<br />
• Faire d'une fonction une classe, évaluée de<br />
manière retardée
Intelligent Children<br />
• Eviter les down casts
Is Kind Of<br />
• Fournir des informations de type
Multiton<br />
class User {<br />
public:<br />
static const User * LogIn(const char * name, const char *<br />
password);<br />
protected:<br />
virtual User * Lookup(const char *name);<br />
private:<br />
}<br />
List * _instances;<br />
class UserName : public ListItem {<br />
}<br />
User* instance;<br />
char* name;
Mutual Friends<br />
• Représenter une relation bidirectionnelle
Named Object
Null Object<br />
• Représenter une relation partielle
Objectifier<br />
• Permettre à un objet de faire varier<br />
dynamiquement son comportement
RTTIVisitor<br />
• Obtenir un cast sûr au moyen du pattern visitor
Sender Argument<br />
• Permettre de s'identifier auprès d'autres objets<br />
par passage d'une référence
Serializer<br />
• Ecrire les objets dans des flux de données pour<br />
les reconstruire plus tard
Timed Relationship<br />
• Représenter une relation qui varie au cours du<br />
temps
The End ...