25.02.2015 Views

Template Method - Laurent Henocque

Template Method - Laurent Henocque

Template Method - Laurent Henocque

SHOW MORE
SHOW LESS

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 ...

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!