Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de...
-
Upload
ihm10 -
Category
Technology
-
view
1.831 -
download
3
description
Transcript of Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de...
![Page 1: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/1.jpg)
Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à
l’aide de patrons de conception
Thierry DuvalISTIC – Université de Rennes 1 / IRISA – EPI Bunraku
Tutorial IHM 2010Luxembourg – 20 septembre 2010
![Page 2: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/2.jpg)
2
Contexte initial
Rendre interactif un noyau orienté objet existant...
C++, Eiffel, Java, C#, …
L’architecture de ce noyau a été déterminée par le domaine d’application
La conception a pu être réalisée par des experts de ce domaine
Les interactions entre les objets de ce noyau et les utilisateurs des applications peuvent ne pas avoir été prévues
![Page 3: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/3.jpg)
3
Réalité du contexte
C’est souvent le cas quand des spécialistes d’un domaine conçoivent un logiciel :
il est souhaitable de les laisser modéliser leur concepts, c’est la meilleure façon d’utiliser leur expertiseon ne peut pas leur imposer une double compétence incluant les IHM
La collaboration avec un expert IHM n’est pas toujours possible au bon moment
Attention :Les architectures logicielles et leurs implémentations proposées ici sont également valides dans un cadre de développement plus général !!! (« from scratch »)
![Page 4: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/4.jpg)
4
Objectif :rendre interactives ces applications
Sans être obligé de tout refaire
En minimisant les coûts :de conceptionde réalisation logicielle
Sans casser l’architecture initiale
En faisant clairement la distinction entre :l’application initialel’interface utilisateur
![Page 5: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/5.jpg)
5
En résumé : le point de départ
Possibilité de disposer d’un noyau applicatif orienté objet :
sans visualisationsans interactionsusceptible de fonctionner de façon autonome
Volonté de lui ajouter une IHM :devant manipuler les concepts applicatifsdevant être indépendante de :
• l’implémentation du noyau applicatif• l’architecture du noyau applicatif
ne devant pas remettre en cause l’architecture initiale
![Page 6: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/6.jpg)
6
Les problèmes qui se posent alors...
Comment lier efficacement l’application initiale et l’interface utilisateur ?
Comment profiter de la (bonne) conception (UML) de l’application initiale ?
comment ne pas la remettre en cause…
![Page 7: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/7.jpg)
7
Les solutions…
Utiliser un modèle d’architecture pour les IHM :à choisir judicieusementà mettre en œuvre à l’aide de patrons de conception
Inciter une bonne conception (UML) de l’application initiale :
à l’aide de patrons de conception adaptés
![Page 8: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/8.jpg)
8
Choix du modèle d’architecture
Doit séparer clairement le noyau applicatif de l’interface utilisateur :
prendre plutôt un modèle apparenté au modèle Seeheim
Doit être adapté au contexte objet :prendre plutôt un modèle multi-agents
PAC ou PAC-Amodeus…
Comment les mettre en œuvre efficacement ?
![Page 9: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/9.jpg)
9
Plan
Problématique
Rappel des modèles PAC et PAC-Amodeus
Mauvaises utilisations de ces modèles
Mise en œuvre de PAC et PAC-Amodeusles patrons de conception à appliquertrois mises en œuvres différentes l’exemple : les tours de Hanoï en java avec Swing
![Page 10: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/10.jpg)
10
Exemple typique en simulation
A1:A A2:Aavancer ()
![Page 11: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/11.jpg)
11
PAC (Joëlle Coutaz, 1987)
:Abstraction :Présentation:Contrôle
:A :P:C
:A :P:C:A :P
:C:A :P
:C
:A :P:C
![Page 12: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/12.jpg)
12
Application directe de PAC
Créer un agent PAC pour chaque objet initial :ajout d’un composant contrôle et d’un composant présentation par objet existantchaque objet initial sera l’abstraction d’un agent PAC
Problème :les objets initiaux communiquaient entre eux……or avec PAC les différents agents ne peuvent communiquer que via leurs composants de contrôle !
![Page 13: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/13.jpg)
13
Application directe de PAC
:A :P:C
![Page 14: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/14.jpg)
14
Application directe de PAC v1
A1:A C1:C P1:P
A2:A C2:C P2:P
avancer ()
A1 communique directement avec A2
Modification de A2 pour communiquer avec C2
![Page 15: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/15.jpg)
15
Application directe de PAC v2A1:A C1:C P1:P
A2:A C2:C P2:P
avancer ()
La connaissance de A2 n’est plus utile à A1
C’est à C1 d’envoyer un message à C2
Duplication dans C1 de la connaissance de A1
Modification de A1 pour communiquer avec C1
![Page 16: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/16.jpg)
16
Premier bilan sur PAC
Résultat non satisfaisant en termes de :coût de développement (modification du code...)facilité de maintenance et d’évolution (duplication de code)hiérarchie obtenue : c’est la hiérarchie initiale et non pas une hiérarchie dictée par le dialogue avec l’utilisateur
Modèle PAC inadapté à la situation ?
« Mauvaise » implémentation du modèle PAC ?
![Page 17: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/17.jpg)
17
Pourquoi PAC serait-il inadapté ici ?
PAC est un modèle purement multi-agents : il faut plaquer la structure initiale en objets de simulation sur une autre structure induite par le modèle…la hiérarchie obtenue correspond à l’organisation du noyau initial et non à celle du dialogue avec l’utilisateur
Cette transformation ne peut donc être effectuée :
à moindre coûtsans modifier la structure initiale
Il faudrait donc un modèle hybride...
![Page 18: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/18.jpg)
18
Composant technique de présentation
Adaptateur de noyau fonctionnel
PAC-Amodeus (Laurence Nigay, 1993)
Ensemble d’objets interactifs de haut niveau
Interface (bidirectionnelle) pour le noyau fonctionnel
Noyau fonctionnel
Spécifique au domaine d’application
Composant bas-niveau d’interaction
Système de fenêtrage
Contrôleur de Dialogue
Objets du Domaine Objets Interactifs
Objets dePrésentation
ObjetsConceptuels
:A :P:C
:A :P:C
:A :P:C
![Page 19: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/19.jpg)
19
Application directe de PAC-Amodeus
Les objets initiaux forment le noyau fonctionnelils peuvent être adaptés au niveau de l’ANFils peuvent communiquer avec une Abstraction d’un agent PAC du contrôleur de dialogue
![Page 20: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/20.jpg)
20
Application directe de PAC-Amodeus
Avantages :les objets initiaux restent des composants logiciels indépendantsla hiérarchie PAC est indépendante de la structure des objets initiauxun agent PAC du Contrôleur de Dialogue est à l’écoute :
• de l’utilisateur par sa facette présentation• du Noyau Fonctionnel par sa facette abstraction
![Page 21: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/21.jpg)
21
Application directe de PAC-Amodeus
:A
:A’ :P:C
:AA
![Page 22: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/22.jpg)
22
Application directe de PAC-Amodeus
A1:A AA1:AA A’1:A’ C1:C P1:P
A2:A AA2:AA A’2:A’ C2:C P2:P
avancer ()
![Page 23: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/23.jpg)
23
Application directe de PAC-Amodeus
Inconvénient majeur (et rédhibitoire) : comme avec PAC, il faut modifier les classes existantes pour leur permettre de communiquer avec les agents PAC-Amodeus
Autres inconvénients :beaucoup (4) de classes doivent être créées pour rendre interactif un objet existantun risque d’inefficacité à l’exécution à cause des nombreux relais lors des invocations de méthodes vers les objets initiaux
![Page 24: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/24.jpg)
24
Plan
Problématique
Rappel des modèles PAC et PAC-Amodeus
Mauvaises utilisations de ces modèles
Mise en œuvre efficace de PAC et PAC-Amodeusles patrons de conception à appliquer :
• Proxy• Abstract Factory (et Template Method ou Interface)
trois mises en œuvres différentesl’exemple : les tours de Hanoï en java avec Swing
![Page 25: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/25.jpg)
25
Principes de la méthode proposée
Utiliser le modèle PAC ou PAC-Amodeus +des interfaces pour chaque type de composant :
• de façon à pouvoir utiliser le polymorphisme et la liaison dynamique
le design pattern «Proxy» :• les contrôles seront les proxys des abstractions
le design pattern «Abstract Factory» :• pour remplacer les abstractions par des contrôles
Faire si besoin des optimisations pour réduire :les coûts de développement (le nombre de classes)le manque d’efficacité à l’exécution
![Page 26: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/26.jpg)
26
Le «Proxy» (GoF 207)
«Structural» Pattern
But, intention :fournir un représentant à un autre objet de façon à ce que ce représentant en contrôle l’accès
![Page 27: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/27.jpg)
27
Structure du «Proxy»
Client Subject
RealSubject Proxy …rs-> Request ()...
+ Request ()
+ Request () + Request ()
1rs
![Page 28: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/28.jpg)
28
L’«Abstract Factory» (GoF 87)
«Creational» Pattern
But, intention :fournir une interface pour créer des familles d’objets (liés ou dérivés) sans avoir à spécifier leurs classes concrètes
Dans notre cas :cela permettra de substituer aux objets initiaux les contrôles (qui implémentent la même interface que les objets initiaux dont ils sont les proxys) des objets interactifs PAC du contrôleur de dialogue
![Page 29: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/29.jpg)
29
Structure de l’«Abstract Factory »
ClientAbstractFactory
+ CreateA1 () : IA1+ CreateA2 () : IA2+ ...
ConcreteFactory1
+ CreateA1 () : IA1+ CreateA2 () : IA2+ ...
1
ConcreteFactory2
+ CreateA1 () : IA1+ CreateA2 () : IA2+ ...
...
return new A1 () ;
return new C1 () ;
![Page 30: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/30.jpg)
30
Plan
Problématique
Rappel des modèles PAC et PAC-Amodeus
Mauvaises utilisations de ces modèles
Mise en œuvre de PAC et PAC-Amodeusles patrons de conception à appliquer trois mises en œuvres différentes :
• Proxy classique (avec usage du patron Delegation)• Proxy + héritage (implémentation non classique du Proxy)• Proxy + Observer (dans le cadre de PAC-Amodeus)
l’exemple : les tours de Hanoï en java avec Swing
![Page 31: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/31.jpg)
31
1ère implémentation proposée
Utilisation du modèle PAC (ou PAC-Amodeus)utilisation d’interfaces :
• de façon à pouvoir utiliser le polymorphisme et la liaison dynamique
le design pattern «Proxy» + «Delegation»le design pattern «Abstract Factory»
Avec l’utilisation de PAC-Amodeus :faire des optimisations pour réduire :
• les coûts de développement (le nombre de classes)• le manque d’efficacité à l’exécution
![Page 32: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/32.jpg)
32
PAC + Proxy + Délégation
IA
C
1
abstraction1
IC
PA
IPprésentation
contrôle
1
![Page 33: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/33.jpg)
33
PAC + Proxy + Délégation
contrôleXXX:C présentation:Pabstraction:A
avancer () {abstraction.avancer () ;présentation.placer (abstraction.getPosition ()) ;
}
1 2
![Page 34: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/34.jpg)
34
PAC + Proxy + Délégation
Définition d’une interface IA :A et C implémentent IAC est un proxy de Aon remplacera les A par des C :
• à l’aide du patron de conception Abstract Factory
Définition d’une interface IP :P implémente IP :
• C sera indépendant le l’implémentation de P (API graphique !)
Définition d’une interface IC (qui hérite de IA) :C implémente IC :
• P sera indépendant de l’implémentation de C
![Page 35: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/35.jpg)
35
PAC-Amodeus + Proxy + Délégation
A
A’ PC
AA1
abstraction1
1
1 application
1
présentation
IA
IC IP
abstraction 1
1contrôle
contrôle
adaptateur
![Page 36: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/36.jpg)
36
PAC-Amodeus + Proxy + Délégation
Définition d’une interface IA :A et AA implémentent IAAA est un proxy de Aon remplacera les A par des AA :
• à l’aide du patron de conception Abstract Factory
Définition d’interfaces IP et IC :comme pour l’utilisation du modèle PAC
![Page 37: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/37.jpg)
37
PAC-Amodeus + Proxy + Délégation
adaptateur:AA
application:A
asbtraction:A’ contrôle:C présentation:P
avancer () {application.avancer () ;abstraction.placer (application.getPosition ()) ;
}1
2
3 4
![Page 38: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/38.jpg)
38
PAC-Amodeus + Proxy + Délégation
Beaucoup (trop ?) de classes à implémenter…
Possibilité de supprimer la facette A’ (cf PAC)ici A’ ne fait que des relais entre AA et C…
Possibilité de regrouper AA et C («Slinky» Arche)AA régule l’accès aux méthodes de A
• propagation vers C pour le maintien de la cohérenceC fait les autres contrôles d’accès à AA
• contrôles faits suite aux entrées de l’utilisateur
Une fois optimisé, on retrouve le modèle PAC !
![Page 39: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/39.jpg)
39
Dernier problème : la création ...
Dans la nouvelle application (interactive) :il faut être capable de remplacer la création des objets initiaux par celle des objets interactifs (les proxys)
Utilisation d’un «Creational Pattern» :le patron de conception «Abstract Factory»l’application initiale doit utiliser ce patron de conceptionc’est la seule contrainte qui lui est imposée...
![Page 40: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/40.jpg)
40
Créer contrôles et présentations
Utiliser également des fabriques de composants :pour une indépendance du contrôle vis à vis de l’implémentation effective de la présentationpour une indépendance de la présentation vis à vis de l’implémentation effective du contrôle
![Page 41: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/41.jpg)
41
Lien avec les composants présentation
Usage d’une API graphique 2D de type Swing :notions de composants et de containersbesoin d’ajouter les présentations les unes dans les autres
Chaque composant contrôle devra :permettre l’accès à son composant présentationgérer l’ajout des présentations de ses sous-composants à l’intérieur de sa propre présentation
• par une délégation à son composant présentation…
![Page 42: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/42.jpg)
42
Conclusion sur cette première méthode
Beaucoup de classes et interfaces à définir
Dépendances minimales entre composants :grâce aux interfaces, aux proxys et aux fabriques de composants
Contraintes minimales pour l’application initiale :usage d’une fabrique de composants
Équivalence totale entre PAC et PAC-Amodeusoptimisé :
utiliser plutôt PAC…ne serait-ce pas plutôt une implémentation de Arche ?
![Page 43: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/43.jpg)
43
2ème implémentation proposée
Utilisation du modèle PAC (ou PAC-Amodeus)utilisation d’interfaces :
• de façon à pouvoir utiliser le polymorphisme et la liaison dynamique
le design pattern «Proxy» + «Héritage»le design pattern «Abstract Factory»
Avec l’utilisation de PAC-Amodeus :faire des optimisations pour réduire :
• les coûts de développement (le nombre de classes)• le manque d’efficacité à l’exécution
![Page 44: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/44.jpg)
44
Le patron «Proxy» + «Héritage»
«Structural» Pattern
But, intention :fournir un représentant à un autre objet de façon à ce que ce représentant en contrôle l’accès
Notre approche est particulière :impose une définition plus précise pour le représentant :
• il héritera de l’objet initialpermet une réutilisation optimale :
• on ne redéfinit ainsi que le strict nécessaire dans le représentant...
![Page 45: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/45.jpg)
45
Structure classique du «Proxy»
Client Subject
RealSubject Proxy …rs-> Request ()...
+ Request ()
+ Request () + Request ()
1rs
![Page 46: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/46.jpg)
46
Structure de notre «Proxy»
Client Subject
RealSubject
Proxy …super-> Request ()...
+ Request ()
+ Request ()
+ Request ()
![Page 47: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/47.jpg)
47
PAC + Proxy + Héritage
IA
A PC
1
présentationIC IP
1
contrôle
![Page 48: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/48.jpg)
48
PAC + Proxy + Héritage
contrôleXXX:C présentation:P
avancer () {super.avancer () ;présentation.placer (getPosition ()) ;
}
21
![Page 49: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/49.jpg)
49
PAC et cette seconde méthode
Beaucoup de classes et interfaces à définir :mais grâce à l’héritage on ne redéfinit que ce qui est absolument nécessaire dans les contrôles
Dépendances entre certains composants :à cause de l’héritage on induit des dépendances fortes entre les composants de contrôle et l’implémentation des composants abstraction dont ils héritent
Facile et rapide à implémenter :même s’il n’y a pas eu d’interfaces de définiesgrâce à l’héritage
![Page 50: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/50.jpg)
50
PAC-Amodeus + Proxy + Héritage
avancer () {super.avancer () ;abstraction.placer (getPosition ()) ;
}A
A’ PC
AA1
abstraction1
1
1
présentation
IA
IC IP
abstraction 1
1contrôle
contrôle
adaptateur
![Page 51: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/51.jpg)
51
Discussion sur la méthode
Avantages : les classes initiales ne sont pas modifiées :
• cela facilite l’évolution du noyau initial, du point de vue de ses créateurs
ceux du modèle PAC-Amodeus :• principalement une bonne séparation entre le noyau et
l’interface utilisateur
Inconvénients :toujours beaucoup de classes à implémenter...toujours assez inefficace à l’exécution...
![Page 52: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/52.jpg)
52
Optimisation de la méthode
Utilisation du mécanisme «Slinky» :suppression des composants de l’ANF :
• conduit à une perte de portabilité : les agents PAC du contrôleur de dialogue dépendent maintenant directement des objets de simulation
les composants Abstraction peuvent hériter directement des objets initiaux
Les agents PAC peuvent être «incomplets» :ici encore, on peut supprimer les facettes abstractionles composants Contrôle peuvent hériter directement des objets initiaux
![Page 53: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/53.jpg)
53
PAC-Amodeus : optimisation Slinky
avancer () {super.avancer () ;contrôle.placer (getPosition ()) ;
}
A’ PC1
1présentationIC IP
abstraction 1
1contrôle
contrôle
1
abstraction 1
adaptateur
A
AA
IA
![Page 54: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/54.jpg)
54
PAC-Amodeus : optimisation Slinky
Regroupement de l’ANF et des abstractions
Indépendance préservée entre contrôle et implémentation de l’application
Perte de l’indépendance des abstractions vis à vis de l’implémentation des composants applicatifs
Moins de classes à écrire
Le contrôle n’est pas forcément le proxy de l’objet applicatif associé
![Page 55: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/55.jpg)
55
PAC-Amodeus : optimisation PAC
avancer () {super.avancer () ;présentation.placer (getPosition ()) ;
}
P
1présentationIC IP
1contrôle
1abstraction 1
contrôle
A
AA
IA
C
![Page 56: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/56.jpg)
56
PAC-Amodeus : optimisation PAC
Indépendance perdue entre contrôle et implémentation de l’application :
à cause de l’héritage
Encore moins de classes et de méthodes à écrire :grâce à l’héritage
Le contrôle devient le proxy de l’objet applicatif associé :
comme c’est le cas avec le modèle PAC
Équivalence avec l’usage du modèle PAC
![Page 57: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/57.jpg)
57
Notre patron «Abstract Factory»
Toujours une utilisation «particulière» de ce pattern :
utilisation de l’héritage entre les différentes «fabriques» d’objets
Toujours dans un but de réutilisation :pour ne redéfinir que ce qui est vraiment nécessaire...
![Page 58: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/58.jpg)
58
Patron «Abstract Factory» classique
ClientAbstractFactory
+ CreateA1 () : IA1+ CreateA2 () : IA2+ ...
ConcreteFactory1
+ CreateA1 () : IA1+ CreateA2 () : IA2+ ...
1
ConcreteFactory2
+ CreateA1 () : IA1+ CreateA2 () : IA2+ ...
...
return new A1 () ;
return new C1 () ;
![Page 59: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/59.jpg)
59
Notre patron «Abstract Factory»
ClientAbstractFactory
+ CreateA1 () : IA1+ CreateA2 () : IA2+ ...
ConcreteFactory1
+ CreateA1 () : IA1+ CreateA2 () : IA2+ ...
1
ConcreteFactory2
+ CreateA1 () : IA1+ CreateA2 () : IA2+ ...
![Page 60: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/60.jpg)
60
Conclusion sur la seconde méthode
Objets initiaux inchangés
Application clairement distinguée de l’interfacemais lien très fort entre contrôles et abstractions…
Coût de développement minimisé :2 nouvelles classes pour rendre interactif un type
2 catégories d’agents PAC :agents initiaux rendus interactifs, liés au NFagents dédiés au dialogue, indépendants du NF
Structure PAC finale dédiée au dialogue
![Page 61: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/61.jpg)
61
3ème implémentation proposée
Utiliser le modèle PAC-Amodeus et :le patron Abstract Factory avec des interfaces :
• de façon à pouvoir utiliser le polymorphisme et la liaison dynamique
le patron Proxy + Héritage :• pour les composants ANF si c’est nécessaire• pour propager les changements d’état à visualiser
le patron Observateur + Proxy + Délégation :• pour les composants de contrôle• pour observer si nécessaire les composants abstraction
associés
![Page 62: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/62.jpg)
62
3ème implémentation proposée
Faire des optimisations raisonnables :pour réduire les coûts de développement (le nombre de classes) et le manque d’efficacité à l’exécution tout en restant indépendant vis à vis du noyau initial
Fusion de l’abstraction et de l’ANF
Ne faire des composants ANF/abstraction que si c’est nécessaire :
seulement s’il faut propager des changements d’état àvisualiserautrement le contrôle est simple proxy de l’objet initial
![Page 63: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/63.jpg)
63
avancer () {abstraction.avancer () ;
}
mettreAJourPosition () {présentation.placer (observé.getPosition ()) ;
}
avancer () {super.avancer () ;observateurs.mettreAJourPosition () ;
}
PAC-Amodeus + Proxy + Observateur
P
1présentationIC IP
1contrôle
1abstraction 1
contrôle
A
AA
IA
C
![Page 64: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/64.jpg)
64
Conclusion sur la troisième méthode
Structure assez proche de la seconde méthode utilisant PAC-Amodeus et une seule optimisation
Implémentation assez différente
Codage un peu alourdi par l’Observateur
Méthode plus générique mais moins efficace ?peu adaptée aux simulations temps-réel…
Mêmes caractéristiques d’indépendance vis à vis du noyau applicatif que la méthode 1 ou que la méthode 2 non (ou peu) optimisée
![Page 65: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/65.jpg)
65
Plan
Problématique
Rappel des modèles PAC et PAC-Amodeus
Mauvaises utilisations de ces modèles
Mise en œuvre de PAC et PAC-Amodeusles patrons de conception à appliquertrois mises en œuvres différentesl’exemple : les tours de Hanoï en java avec Swing :
• trois façons de visualiser la résolution du problème• comment aller jusqu’à la manipulation directe ?
![Page 66: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/66.jpg)
66
Exemple : les tours de Hanoï
Une application Java permettant de décrire les actions à réaliser pour résoudre le problème des tours de Hanoï avec N anneaux
Un package décrivant les concepts à manipuler
Un package les implémentant
Utilisation d’une fabrique de composants pour en faciliter l’évolution
Un programme principal chargé d’instancier la bonne fabrique de composants
![Page 67: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/67.jpg)
67
Le noyau applicatif initial
Déclare les concepts applicatifs nécessairesIAnneau : accès à la valeur d’un anneauITour : modification du contenu et obtention d’infosIHanoi : accès aux 3 tours et résolution du problèmeIFactory : création des composants applicatifs
Implémente ces concepts de façon adéquate :AAnneau, ATour, AHanoi et AFactory
Un programme principal stocke une fabrique de création des composants dans une classe ConcreteFactory
![Page 68: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/68.jpg)
68
Le package interfaceAbstraction
![Page 69: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/69.jpg)
69
Le package abstraction
![Page 70: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/70.jpg)
70
Utilisation du noyau applicatif
public class MainHanoi {public static void main (String args []) {
int n = 2 ;if (args.length > 0) {
n = Integer.parseInt (args [0]) ;}concreteFactory.ConcreteFactory.setFactory (
abstraction.AFactory.getInstance ()) ;IHanoi h = concreteFactory.ConcreteFactory.getFactory ().newHanoi (n) ;h.solve () ;
}}
![Page 71: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/71.jpg)
71
Aperçu de la classe AHanoi
public class AHanoi implements IHanoi {
public AHanoi (int n) {IFactory f = concreteFactory.ConcreteFactory.getFactory () ;this.n = n ;d = f.newTour ("d", n) ;i = f.newTour ("i", n) ;a = f.newTour ("a", n) ;for (int ii = n ; ii > 0 ; ii --) {
IAnneau ia = f.newAnneau (ii) ;d.empiler (ia) ;
}}
![Page 72: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/72.jpg)
72
Construction de la classe AHanoi
![Page 73: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/73.jpg)
73
Aperçu de la classe AHanoi
protected void hanoi (ITour d, ITour i, ITour a, int n) {if (n > 0) {
hanoi (d, a, i, n - 1) ;System.out.println ("déplacer l'anneau "
+ d.getSommet ().getValeur () + " de la tour "+ d.getNom () + " vers la tour " + a.getNom ()) ;
IAnneau anneau = d.getSommet () ;d.depiler () ;a.empiler (anneau) ;hanoi (i, d, a, n - 1) ;
}}
public void solve () {hanoi (d, i, a, n) ;
}
![Page 74: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/74.jpg)
74
Les composants de présentation
Masquent l’utilisation d’une API graphique :via des interfaces de présentation logique
Définissent les besoins logiques de présentation :IPAnneau : placement et glissement d’un anneauIPTour : empilement et dépilement d’un IPAnneauIPHanoi : ajout d’un composant IPTourIPFactory : création des présentations
Sont implémentés (en Swing) de façon adéquate :PAnneau, PTour, PHanoi, PFactory
![Page 75: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/75.jpg)
75
Le package présentation
![Page 76: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/76.jpg)
76
Aperçu de la classe PAnneau
public class PAnneau extends JPanel implements IPAnneau {
static final int unite = 30 ;
public PAnneau (int v, ICAnneau controle) {setSize (unite * v, unite) ;setPreferredSize (getSize ()) ;setBackground (Color.blue) ;this.controle = controle ;
}
public void setLocation (int x, int y) {super.setLocation (x - getWidth () / 2, y - getHeight ()) ;
}
…
![Page 77: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/77.jpg)
77
Aperçu de la classe PTour
public class PTour extends JPanel implements IPTour {
protected int x, y ;
public PTour (int n, ICTour controle) {this.controle = controle ;setSize (n * PAnneau.unite + PAnneau.unite / 3,
(n + 2) * PAnneau.unite) ;setPreferredSize (getSize ()) ;setBackground (Color.orange) ;setLayout (null) ;x = getWidth () / 2 ;y = getHeight () ;
}
![Page 78: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/78.jpg)
78
Aperçu de la classe PTour
public void empiler (IPAnneau pa) {Point pos = new Point (getX () + x, pa.getHeight () + getY ()) ;pa.slipTo (pos.x, pos.y) ;if (getParent () != null) { // test pour l’empilement initial
getParent ().remove ((PAnneau)pa) ;}pa.setLocation (x, pa.getHeight ()) ;add ((PAnneau)pa, 0) ;repaint () ; // bug visuel sinonpa.slipTo (x, y) ;y = y - pa.getHeight () ;
}
![Page 79: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/79.jpg)
79
PTour : empilement d’un PAnneau
![Page 80: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/80.jpg)
80
Aperçu de la classe PTour
public void depiler (IPAnneau pa) {pa.slipTo (x, pa.getHeight ()) ;remove ((PAnneau)pa) ;Point pos = new Point (getX () + x, pa.getHeight () + getY ()) ;pa.setLocation (pos.x, pos.y) ;getParent ().add ((PAnneau)pa, 0) ;getParent ().repaint () ;y = y + pa.getHeight () ;
}
![Page 81: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/81.jpg)
81
PTour : dépilement d’un PAnneau
![Page 82: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/82.jpg)
82
Aperçu de la classe PHanoi
public class PHanoi extends JFrame implements IPHanoi {
public PHanoi (int n) {super ("Les tours de Hanoï avec " + n + " anneaux") ;getContentPane ().setLayout (new FlowLayout ()) ;addWindowListener (new WindowAdapter () {
public void windowClosing (WindowEvent e) { System.exit (0) ; } }) ;pack () ;setVisible (true) ;
}
public void ajouter (IPTour p) {getContentPane ().add ((PTour)p) ;pack () ;setVisible (true) ;
}
![Page 83: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/83.jpg)
83
Le package interfaceControle
![Page 84: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/84.jpg)
84
Les composants de contrôle (m1)
Vont être des proxys des composants applicatifs associés et se substitueront à eux grâce à l’usage d’une fabrique de composants
Définissent les besoins au niveau du contrôle :ICAnneau, ICTour, ICHAnoi
Sont implémentés par délégation :CAnneau, CTour, CHanoi
![Page 85: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/85.jpg)
85
Le package contrôle : l’anneau (m1)
![Page 86: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/86.jpg)
86
Aperçu de la classe CAnneau (m1)
public class CAnneau implements ICAnneau {
public CAnneau (int v) {abstraction = ConcreteFactory.getAFactory ().newAnneau (v) ;presentation = ConcreteFactory.getPFactory ().newPAnneau (v, this) ;
}
protected IAnneau abstraction ;protected IPAnneau presentation ;
public int getValeur () {return abstraction.getValeur () ;
}
public IPAnneau getPresentation () {return presentation ;
}}
![Page 87: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/87.jpg)
87
Le package contrôle : la tour (m1)
![Page 88: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/88.jpg)
88
Aperçu de la classe CTour (m1)
public class CTour implements ICTour {
public CTour (String nom, int nbAnneauxMax) {AFactory af = ConcreteFactory.getAFactory () ;abstraction = af.newTour (nom, nbAnneauxMax) ;PFactory pf = ConcreteFactory.getPFactory () ;presentation = pf.newPTour (nbAnneauxMax, this) ;
}
protected ITour abstraction ;
protected IPTour presentation ;
![Page 89: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/89.jpg)
89
Construction de CTour
![Page 90: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/90.jpg)
90
Aperçu de la classe CTour (m1)
public IAnneau getSommet () {return abstraction.getSommet () ;
}
public boolean isVide () {return abstraction.isVide () ;
}
public String getNom () {return abstraction.getNom () ;
}
public IPTour getPresentation () {return presentation ;
}
![Page 91: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/91.jpg)
91
Aperçu de la classe CTour (m1)
public void empiler (IAnneau aa) {abstraction.empiler (aa) ;ICAnneau ca = (ICAnneau)aa ;IPAnneau pa = ca.getPresentation () ;presentation.empiler (pa) ;
}
public void depiler () {ICAnneau ca = (ICAnneau)getSommet () ;abstraction.depiler () ;IPAnneau pa = ca.getPresentation () ;presentation.depiler (pa) ;
}
}
![Page 92: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/92.jpg)
92
CTour : empilement d’un CAnneau
![Page 93: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/93.jpg)
93
CTour : dépilement d’un CAnneau
![Page 94: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/94.jpg)
94
Le package contrôle : hanoi (m1)
![Page 95: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/95.jpg)
95
Aperçu de la classe CHanoi (m1)
public class CHanoi implements ICHanoi {
protected IHanoi abstraction ;
protected IPHanoi presentation ;
public CHanoi (int n) {IFactory af = ConcreteFactory.getAFactory () ;abstraction = af.newHanoi (n) ;IPFactory pf = ConcreteFactory.getPFactory () ;presentation = pf.newPHanoi (n) ;ICTour cDep = (ICTour)getTourDepart () ;IPTour pDep = cDep.getPresentation () ;presentation.ajouter (pDep) ;presentation.ajouter (((ICTour)getTourIntermediaire()).getPresentation()) ;presentation.ajouter (((ICTour)getTourArrivee ()).getPresentation ()) ;
}
![Page 96: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/96.jpg)
96
Aperçu de la classe CHanoi (m1)
public void solve () {abstraction.solve () ;
}
public ITour getTourDepart () {return abstraction.getTourDepart () ;
}
public ITour getTourIntermediaire () { … }
public ITour getTourArrivee () { … }
public IPHanoi getPresentation () {return presentation ;
}
} // class CHanoi
![Page 97: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/97.jpg)
97
Construction de CHanoi
![Page 98: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/98.jpg)
98
La classe ConcreteFactory
![Page 99: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/99.jpg)
99
Aperçu du programme principal (m1)
public class MainHanoiPACSwing {public static void main (String args []) {
int n = 5 ;if (args.length > 0) {
n = Integer.parseInt (args [0]) ;}concreteFactory.ConcreteFactory.setAFactory (
abstraction.AFactory.getInstance ()) ;concreteFactory.ConcreteFactory.setCFactory (
controle.CFactory.getInstance ()) ;concreteFactory.ConcreteFactory.setPFactory (
presentationSwing.PFactory.getInstance ()) ;IHanoi h = concreteFactory.ConcreteFactory.getFactory ().newHanoi (n) ;h.solve () ;
}} // class MainHanoiPACSwing
![Page 100: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/100.jpg)
100
La méthode getFactory…
public class ConcreteFactory {
protected static IFactory aFactory ;protected static IFactory cFactory ;
…public static IFactory getFactory () {
IFactory factory = aFactory ;if (cFactory != null) {
factory = cFactory ;}return (factory) ;
}…
}
![Page 101: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/101.jpg)
101
Synthèse de la première méthode
PAC + proxy + délégation + fabrique de composants
Abstraction inchangée
Contrôle indépendant des implémentations :de l’applicationde la présentation
Les contrôles offrent l’accès à leur présentation :pour permettre des relation conteneur-contenu au niveau des présentations
![Page 102: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/102.jpg)
102
Les composants de contrôle (m2)
Vont être des proxys des composants applicatifs associés et se substitueront à eux grâce à l’usage d’une fabrique de composants
Définissent les besoins au niveau du contrôle :ICAnneau, ICTour, ICHAnoi
Sont implémentés par héritage :CAnneau, CTour, CHanoi
![Page 103: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/103.jpg)
103
Le package contrôleHéritage (m2)
![Page 104: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/104.jpg)
104
Aperçu de la classe CAnneau (m2)
public class CAnneau extends AAnneau implements ICAnneau {
public CAnneau (int v) {super (v) ;presentation = ConcreteFactory.getPFactory ().newPAnneau (v, this) ;
}
public IPAnneau getPresentation () {return presentation ;
}
protected IPAnneau presentation ;
} // class CAnneau
![Page 105: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/105.jpg)
105
Le package contrôleHéritage (m2)
![Page 106: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/106.jpg)
106
Aperçu de la classe CTour (m2)
public class CTour extends ATour implements ICTour {
public CTour (String nom, int nbAnneauxMax) {super (nom, nbAnneauxMax) ;presentation = ConcreteFactory.getPFactory ().newPTour (
nbAnneauxMax, this) ;}
protected IPTour presentation ;
public IPTour getPresentation () {return presentation ;
}
![Page 107: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/107.jpg)
107
Aperçu de la classe CTour (m2)
public void empiler (IAnneau aa) {super.empiler (aa) ;IPAnneau pa = (((ICAnneau)aa).getPresentation ()) ;presentation.empiler (pa) ;
}
public void depiler () {ICAnneau ca = (ICAnneau)getSommet () ;super.depiler () ;IPAnneau pa = ca.getPresentation () ;presentation.depiler (pa) ;
}
} // class CTour
![Page 108: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/108.jpg)
108
Le package contrôleHéritage (m2)
![Page 109: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/109.jpg)
109
Aperçu de la classe CHanoi (m2)
public class CHanoi extends AHanoi implements ICHanoi {public CHanoi (int n) {
super (n) ;presentation = ConcreteFactory.getPFactory ().newPHanoi (n) ;presentation.ajouter (((ICTour)getTourDepart ()).getPresentation ()) ;presentation.ajouter (((ICTour)getTourIntermediaire ())
.getPresentation ()) ;presentation.ajouter (((ICTour)getTourArrivee ()).getPresentation ()) ;
}
protected IPHanoi presentation ;
public IPHanoi getPresentation () {return presentation ;
}
} // class CHanoi
![Page 110: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/110.jpg)
110
Aperçu de la classe CFactory (m2)
public class CFactory implements IFactory {
public ITour newTour (String nom, int nbAnneauxMax) {return (new CTour (nom, nbAnneauxMax)) ;
}
public IAnneau newAnneau (int v) {return (new CAnneau (v)) ;
}
public IHanoi newHanoi (int n) {return new CHanoi (n) ;
}
![Page 111: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/111.jpg)
111
Aperçu de la classe CFactory (m2)
protected CFactory () { }
private static IFactory instance = new CFactory () ;
public static IFactory getInstance () {return instance ;
}
} // class CFactory
![Page 112: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/112.jpg)
112
Aperçu du programme principal (m2)
public class MainHanoiHeritageSwing {public static void main (String args []) {
int n = 5 ;if (args.length > 0) {
n = Integer.parseInt (args [0]) ;}concreteFactory.ConcreteFactory.setAFactory (
abstraction.AFactory.getInstance ()) ;concreteFactory.ConcreteFactory.setCFactory (
controleHeritage.CFactory.getInstance ()) ;concreteFactory.ConcreteFactory.setPFactory (
presentationSwing.PFactory.getInstance ()) ;IHanoi h = concreteFactory.ConcreteFactory.getFactory ().newHanoi (n) ;h.solve () ;
}} // class MainHanoiHeritage
![Page 113: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/113.jpg)
113
Synthèse de la seconde méthode
PAC + proxy + héritage + fabrique de composants
Abstraction inchangée
Contrôle devenu dépendant de l’implémentation :de l’application, à cause des liens d’héritage…
Plus léger à mettre en œuvre :interfaces applicatifs pas absolument nécessaires…
![Page 114: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/114.jpg)
114
Adaptation du noyau fonctionnel (m3)
Seule la notion de tour est concernée :c’est le seul composant qui évolue dynamiquement au cours de l’application (empilement et dépilement d’anneaux)
Définition de méthodes permettant de s’abonner aux changements d’états suite à :
un empilementun dépilement
Définition de classes pouvant s’abonner à ces changements d’états :
on se base ici sur le concept de PropertyChangeListener
![Page 115: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/115.jpg)
115
Le package interfaceANF (m3)
![Page 116: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/116.jpg)
116
Adaptation du noyau fonctionnel (m3)
Adaptation effective par la classe ANFTour
Implémentation via les méthodes :addEmpilerListener
• abonnement aux changements suite aux empilementsaddDepilerListener
• Abonnement aux changements suite aux dépilementsempiler
• notification des modifications aux abonnés après empilementdepiler
• notification des modifications aux abonnés après dépilement
![Page 117: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/117.jpg)
117
Le package ANF (m3)
![Page 118: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/118.jpg)
118
Aperçu de la classe ANFTour (m3)
public class ANFTour extends ATour implements IANFTour {
public ANFTour (String nom, int n) {super (nom, n) ;
}
private PropertyChangeSupport support =new PropertyChangeSupport (this) ;
public void addEmpilerListener (PropertyChangeListener s) {support.addPropertyChangeListener ("empiler", s) ;
}
public void addDepilerListener (PropertyChangeListener s) {support.addPropertyChangeListener ("depiler", s) ;
}
![Page 119: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/119.jpg)
119
Aperçu de la classe ANFTour (m3)
public void empiler (IAnneau a) {super.empiler (a) ;support.firePropertyChange ("empiler", null, a) ;
}
public void depiler () {IAnneau a = getSommet () ;super.depiler () ;support.firePropertyChange ("depiler", null, a) ;
}
} // class ANFTour
![Page 120: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/120.jpg)
120
Le package controleANF (m3)
Le contrôle de tour peut s’abonner aux évolutions de l’ANFTour associé :
en implémentant PropertyChangeListener• méthode propertyChange
![Page 121: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/121.jpg)
121
Le package controleANF (m3)
![Page 122: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/122.jpg)
122
Aperçu de la classe CTour (m3)
public class CTour implements ICTour, propertyChangeListener {
public CTour (String nom, int nbAnneauxMax) {abstraction = (IANFTour)ConcreteFactory.getAFactory ().newTour (
nom, nbAnneauxMax) ;presentation = ConcreteFactory.getPFactory ().newPTour (
nbAnneauxMax, this) ;abstraction.addDepilerListener (this) ;abstraction.addEmpilerListener (this) ;
}
public IAnneau getSommet () {return abstraction.getSommet () ;
}
![Page 123: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/123.jpg)
123
Aperçu de la classe CTour (m3)
public void propertyChange (PropertyChangeEvent evt) {if (evt.getPropertyName ().equals ("empiler")) {
ICAnneau a = (ICAnneau)evt.getNewValue () ;presentation.empiler (a.getPresentation ()) ;
} else if (evt.getPropertyName ().equals ("depiler")) {ICAnneau a = (ICAnneau)evt.getNewValue () ;presentation.depiler (a.getPresentation ()) ;
}}
public void empiler (IAnneau aa) {abstraction.empiler (aa) ;
}
public void depiler () {abstraction.depiler () ;
}…
![Page 124: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/124.jpg)
124
Aperçu du programme principal (m3)
public class MainHanoiANFSwing {public static void main (String args []) {
int n = 3 ;if (args.length > 0) {
n = Integer.parseInt (args [0]) ;}concreteFactory.ConcreteFactory.setAFactory (
ANF.ANFFactory.getInstance ()) ;concreteFactory.ConcreteFactory.setCFactory (
controleANF.CFactory.getInstance ()) ;concreteFactory.ConcreteFactory.setPFactory (
presentationSwing.PFactory.getInstance ()) ;IHanoi h = concreteFactory.ConcreteFactory.getFactory ().newHanoi (n) ;h.solve () ;
}} // class MainHanoiANFSwing
![Page 125: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/125.jpg)
125
Synthèse de la troisième méthode
PAC-Amodeus + proxy + héritage + obervateur + fabrique de composants
Abstraction inchangée
Contrôle indépendant de l’implémentation :de l’applicationde la présentation
Plus lourd à mettre en œuvre :définition de protocoles entre ANF et contrôle
![Page 126: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/126.jpg)
126
Passage à la manipulation directe (i)
Nouveaux besoins à prendre en compte :actions de l’utilisateur sur des anneauxreconnaissance de l’entrée ou de la sortie d’un anneau sur une tournouvelles méthodes de vérification à ajouternouvelles méthodes de mise en évidence à ajouter
![Page 127: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/127.jpg)
127
Début de drag’n drop réussi
![Page 128: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/128.jpg)
128
Début de drag’n drop raté
![Page 129: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/129.jpg)
129
Gestion du dragEnter d’un anneau
![Page 130: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/130.jpg)
130
Gestion du dragExit d’un anneau
![Page 131: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/131.jpg)
131
Gestion du drop réussi d’un anneau
![Page 132: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/132.jpg)
132
Gestion du drop raté d’un anneau
![Page 133: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/133.jpg)
133
Le package interfacePrésentation (i)
![Page 134: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/134.jpg)
134
Le package présentation (i)
![Page 135: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/135.jpg)
135
Aperçu de la classe PAnneauInter
public class PAnneauInter extends Panneauimplements IPAnneauInter, Transferable {
public PAnneauInter (int v, ICAnneau controle) {super (v, controle) ;
}
public ICAnneauInter getControle () {return (ICAnneauInter)controle ;
}
![Page 136: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/136.jpg)
136
Aperçu de la classe PAnneauInter
public void setSelectionnable (boolean b) {if (b) {
setCursor (new Cursor (Cursor.HAND_CURSOR)) ;setBackground (Color.cyan) ;
} else {setCursor (new Cursor (Cursor.WAIT_CURSOR)) ;setBackground (Color.blue) ;
}}
public void setSelected (boolean b) {if (b) {
setBackground (Color.magenta) ;} else {
setBackground (Color.blue) ;}
}
![Page 137: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/137.jpg)
137
Aperçu de la classe PAnneauInter
public Object getTransferData (DataFlavor flavor) {Object result = null ;if (flavor.isMimeTypeEqual (DataFlavor.javaJVMLocalObjectMimeType)) {
result = this ;}return (result) ;
}
public DataFlavor [] getTransferDataFlavors () {DataFlavor data [] = new DataFlavor [1] ;try {data [0] = new DataFlavor (DataFlavor.javaJVMLocalObjectMimeType) ;
} catch (java.lang.ClassNotFoundException e) { }return (data) ;
}
![Page 138: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/138.jpg)
138
Aperçu de la classe PAnneauInter
public boolean isDataFlavorSupported (DataFlavor flavor) {boolean result = false ;if (flavor.isMimeTypeEqual (DataFlavor.javaJVMLocalObjectMimeType)) {
result = true ;}return (result) ;
}
} // class PAnneauInter
![Page 139: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/139.jpg)
139
Le package présentation (i)
![Page 140: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/140.jpg)
140
Le package interfaceContrôle (i)
![Page 141: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/141.jpg)
141
Aperçu de la classe PTourInter
public class PTourInter extends PTour implements IPTourInter {
protected PAnneauInter selected = null ;
protected Point dragOrigin = new Point (0, 0) ;
public PTourInter (int n, ICTour controle) {super (n, controle) ;setBackground (Color.yellow) ;
}
public void visualiserSortieDnD () {setBackground (Color.yellow) ;
}
![Page 142: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/142.jpg)
142
Aperçu de la classe PTourInter
public void visualiserEmpilable (boolean isEmpilable) {if (isEmpilable) {
setBackground (Color.green) ;} else {
setBackground (Color.red) ;}getParent ().repaint () ;
}
public void empiler (IPAnneau pa) {if (getParent () != null) {getParent ().remove ((PAnneau)pa) ;getParent ().repaint () ;
}pa.setLocation (x, y) ;add ((PAnneau)pa, 0) ;y = y - pa.getHeight () ;
}
![Page 143: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/143.jpg)
143
Aperçu de la classe PTourInter
public void depiler (IPAnneau pa) {remove ((PAnneau)pa) ;pa.setLocation (getX () + dragOrigin.x
- getRootPane ().getParent ().getX (),getY () + dragOrigin.y- getRootPane ().getParent ().getY ()) ;
getParent ().add ((PAnneau)pa, 0) ;y = y + pa.getHeight () ;
}
public void afficherMessageBloquant (String type, String message) {JOptionPane.showMessageDialog (null, message, type,
JOptionPane.INFORMATION_MESSAGE) ;}
} // class PTourInter
![Page 144: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/144.jpg)
144
Aperçu de la classe PTourInterAWT
public class PTourInterAWT extends PTourInter {
protected DragSource dragSource = null ;
protected MyDragSourceListener myDragSourceListener = null ;
protected DragGestureEvent theInitialEvent ;
protected DropTargetDropEvent theFinalEvent ;
protected DropTarget dropTarget = null ;
![Page 145: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/145.jpg)
145
Aperçu de la classe PTourInterAWT
protected class MyDragGestureListenerimplements DragGestureListener {
public void dragGestureRecognized (DragGestureEvent event) {selected = null ;ICAnneauInter selectedControl = null ;theInitialEvent = event ;dragOrigin = event.getDragOrigin () ;try {
selected = (PAnneauInter)getComponentAt (dragOrigin) ;selectedControl = (ICAnneauInter)selected.getControle () ;
} catch (Exception e) { }((ICTourInter)controle).debutDnDDrag (selectedControl) ;
}
} // class MyDragGestureListener
![Page 146: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/146.jpg)
146
Aperçu de la classe PTourInterAWT
protected class MyDragSourceListenerimplements DragSourceListener {
public void dragDropEnd (DragSourceDropEvent event) {((ICTourInter)controle).finDnDDrag (selected.getControle (),
event.getDropSuccess ()) ;repaint () ;
}
![Page 147: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/147.jpg)
147
Aperçu de la classe PTourInterAWT
public void dragEnter (DragSourceDragEvent event) {event.getDragSourceContext ().setCursor (
new Cursor (Cursor.MOVE_CURSOR)) ;// juste pour avoir un curseur OK ?
}
public void dragExit (DragSourceEvent event) { }
public void dragOver (DragSourceDragEvent event) { }
public void dropActionChanged (DragSourceDragEvent event) { }
} // class MyDragSourceListener
![Page 148: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/148.jpg)
148
Aperçu de la classe PTourInterAWT
protected class MyDragSourceMotionListenerimplements DragSourceMotionListener {
public void dragMouseMoved (DragSourceDragEvent event) {selected.setLocation (event.getLocation ().x
- getRootPane ().getParent ().getX (),event.getLocation ().y- getRootPane ().getParent ().getY ()) ;
}
} // MyDragSourceMotionListener
![Page 149: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/149.jpg)
149
Aperçu de la classe PTourInterAWT
protected class MyDropTargetListener implements DropTargetListener {
protected PAnneauInter pa = null ;public void dragEnter (DropTargetDragEvent event) {
try {Transferable transferable = event.getTransferable () ;if (transferable.isDataFlavorSupported (new DataFlavor (
DataFlavor.javaJVMLocalObjectMimeType))) {event.acceptDrag (DnDConstants.ACTION_MOVE) ;pa = (PAnneauInter)transferable.getTransferData (
new DataFlavor (DataFlavor.javaJVMLocalObjectMimeType)) ;}
} catch (java.io.IOException exception) {} catch (UnsupportedFlavorException ufException) {} catch (java.lang.ClassNotFoundException e) { }((ICTourInter)controle).entreeDnDDrop (
(ICAnneauInter)pa.getControle ()) ;}
![Page 150: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/150.jpg)
150
Aperçu de la classe PTourInterAWT
public void dragExit (DropTargetEvent event) {((ICTourInter)controle).sortieDnDDrop (
(ICAnneauInter)pa.getControle ()) ;}
public void dragOver (DropTargetDragEvent event) { }
public void drop (DropTargetDropEvent event) {theFinalEvent = event ;((ICTourInter)controle).finDnDDrop ((ICAnneauInter)pa.getControle ()) ;
}
public void dropActionChanged (DropTargetDragEvent event) { }
} // class MyDropTargetListener
![Page 151: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/151.jpg)
151
Aperçu de la classe PTourInterAWT
public void debutDnDValide () {dragSource.startDrag (
theInitialEvent, DragSource.DefaultMoveNoDrop,(PAnneauInter)selected, myDragSourceListener) ;
repaint () ;}
public void debutDnDInvalide () { }
public void finDnDValide () {theFinalEvent.acceptDrop (DnDConstants.ACTION_MOVE) ;theFinalEvent.getDropTargetContext ().dropComplete (true) ;
}
public void finDnDInvalide () {theFinalEvent.rejectDrop () ;
}
![Page 152: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/152.jpg)
152
Aperçu de la classe PTourInterAWT
public PTourInterAWT (int n, ICTour controle) {super (n, controle) ;myDragSourceListener = new MyDragSourceListener () ;dragSource = new DragSource () ;dragSource.createDefaultDragGestureRecognizer (
this, DnDConstants.ACTION_MOVE,new MyDragGestureListener ()) ;
dragSource.addDragSourceMotionListener (new MyDragSourceMotionListener ()) ;
dropTarget = new DropTarget (this, new MyDropTargetListener ()) ;
}
} // classe PTourInterAWT
![Page 153: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/153.jpg)
153
Le package contrôle (i)
![Page 154: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/154.jpg)
154
Aperçu de la classe CAnneauInter
public class CAnneauInter extends CAnneauimplements ICAnneauInter {
public CAnneauInter (int v) {super (v) ;
}
public void setSelectionnable (boolean b) {((IPAnneauInter)presentation).setSelectionnable (b) ;
}
public void setSelected (boolean b) {((IPAnneauInter)presentation).setSelected (b) ;
}
} // class CAnneauInter
![Page 155: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/155.jpg)
155
Le package contrôle (i)
![Page 156: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/156.jpg)
156
Aperçu de la classe CTourInter
public class CTourInter extends CTourimplements ICTourInter {
public CTourInter (String nom, int nbAnneauxMax) {super (nom, nbAnneauxMax) ;
}
protected static int nbSelectionEchecs = 0 ;
protected static int nbDragEchecs = 0 ;
protected static int nbDropEchecs = 0 ;
![Page 157: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/157.jpg)
157
Aperçu de la classe CTourInter
public void empiler (IAnneau aa) {if (! isVide ()) {
((ICAnneauInter)getSommet ()).setSelectionnable (false) ;}super.empiler (aa) ;((ICAnneauInter)aa).setSelected (false) ;((ICAnneauInter)aa).setSelectionnable (true) ;
}
public boolean isEmpilable (IAnneau a) {boolean result = isVide () ;if (! result) {
result = (a.getValeur () < getSommet ().getValeur ()) ;}return (result) ;
}
![Page 158: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/158.jpg)
158
Aperçu de la classe CTourInter
public void depiler () {ICAnneauInter ca = (ICAnneauInter)getSommet () ;ca.setSelectionnable (false) ;ca.setSelected (true) ;super.depiler () ;if (! isVide ()) {
((ICAnneauInter)getSommet ()).setSelectionnable (true) ;}
}
public boolean isDepilable (IAnneau a) {boolean result = false ;if (! isVide ()) {
result = (a == getSommet ()) ;}return (result) ;
}
![Page 159: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/159.jpg)
159
Aperçu de la classe CTourInter
public void debutDnDDrag (ICAnneauInter a) {if (a != null) {
nbSelectionEchecs = 0 ;if (isDepilable (a)) {
depiler () ;((IPTourInter)presentation).debutDnDValide () ;nbDragEchecs = 0 ;
} else {((IPTourInter)presentation).debutDnDInvalide () ;nbDragEchecs = nbDragEchecs + 1 ;if (nbDragEchecs == 3) {
((IPTourInter)presentation).afficherMessageBloquant ("Avertissement de départ de Drag'n Drop",
"Interdit de déplacer un anneau non sommet") ;nbDragEchecs = 0 ;
}}
} else { echecSelection () ; } }
![Page 160: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/160.jpg)
160
Aperçu de la classe CTourInter
public void echecSelection () {nbSelectionEchecs = nbSelectionEchecs + 1 ;if (nbSelectionEchecs == 3) {
((IPTourInter)presentation).afficherMessageBloquant ("Avertissement de reconnaissance de Drag'n Drop","Cliquer sur un anneau pour amorcer le Drag'n Drop") ;
nbSelectionEchecs = 0 ;}
}
public void entreeDnDDrop (ICAnneauInter a) {((IPTourInter)presentation).visualiserEmpilable (isEmpilable (a)) ;
}
public void sortieDnDDrop (ICAnneauInter a) {((IPTourInter)presentation).visualiserSortieDnD () ;
}
![Page 161: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/161.jpg)
161
Aperçu de la classe CTourInter
public void finDnDDrop (ICAnneauInter a) {if (isEmpilable (a)) {
empiler (a) ;((IPTourInter)presentation).finDnDValide () ;nbDropEchecs = 0 ;
} else {nbDropEchecs = nbDropEchecs + 1 ;if (nbDropEchecs == 3) {
((IPTourInter)presentation).afficherMessageBloquant ("Avertissement d'arrivée de Drag'n Drop","Interdit de poser un anneau sur un plus petit que lui") ;
nbDropEchecs = 0 ;}((IPTourInter)presentation).finDnDInvalide () ;
}((IPTourInter)presentation).visualiserSortieDnD () ;
}
![Page 162: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/162.jpg)
162
Aperçu de la classe CTourInter
public void finDnDDrag (ICAnneauInter a, boolean success) {if (! success ) {
empiler (a) ;}
}
} // classe CTourInter
![Page 163: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/163.jpg)
163
Synthèse du passage à l’interaction
Ajout d’une couche logique pour s’abstraire des mécanismes de drag’n drop offerts par Java :
seuls les composants de présentation sont liés à cette technologie
Tout à fait compatible avec les méthodologies proposées
![Page 164: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/164.jpg)
164
D’un point de vue génie logiciel...
On sait enfin mettre en œuvre un modèle d’architecture d’IHM (et de 3 façons…)
Les démarches sont efficaces (!…?)
Le noyau applicatif initial est :inchangéclairement séparé de l’interface utilisateur
Nous avons minimisé :coûts de conception et de développementperte d’efficacité à l’exécution
![Page 165: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/165.jpg)
165
D’un point de vue IHM...
L’essentiel est préservé...
2 catégories d’agents PAC : les agents liés aux composants de l’application
• ceux dont on a présenté la construction…les agents dédiés au dialogue utilisateur
• les autres...
La structure du contrôleur de dialogue :est indépendante de celle du noyau initialpeut être centrée sur l’utilisateur
![Page 166: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/166.jpg)
166
Conclusion
La méthode de transformation proposée :est générale, pour tout noyau objet utilisant des patterns de création tels que l’«Abstract Factory»est basée sur les modèles PAC et PAC-Amodeusrepose essentiellement sur les patrons Proxy et Abstract Factory :
• et sur la délégation (méthode 1)• ou sur l’héritage (méthode 2)• ou sur l’observateur (méthode 3)
utilise le polymorphisme et la liaison dynamique
Cette méthode ne modifie pas le noyau initial !
![Page 167: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/167.jpg)
167
Au sujet des fabriques
Si beaucoup de classes dans l’application :la fabrique de composants est énorme…
Réaliser l’application en plusieurs triplets de packages :
(abstraction, contrôle, présentation)
Faire des «Fabriques de Fabriques» :une fabrique principale pour l’application interactiveune fabrique de composants par package
![Page 168: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/168.jpg)
168
Validation… et perspectives
Méthode validée dans les langages :Java (AWT, Swing : application + applet, SWT)C++ (X11, API graphique 3D OpenInventor)Flash (par Jean-Claude Tarby)
Méthode enseignée :en M2 à Rennes depuis 2000 (Java + Swing)en M2 à Lille depuis 2005 (Flash Action Script)
Méthode utilisée dans un contexte industriel :e-manation à Nantes (Zoé et Léa…)
Le présenter comme un Design Pattern… ?
![Page 169: Méthode d’implémentation efficace des modèles PAC et PAC-Amodeus à l’aide de patrons de conception](https://reader033.fdocument.pub/reader033/viewer/2022052601/558a2267d8b42a27788b4639/html5/thumbnails/169.jpg)
169
Bibliographie
Joëlle Coutaz :« PAC : an Object Oriented Model for implementing User interfaces », ACM SIGCHI Bulletin, numéro 2, volume 19, 1987.
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides :« Design Patterns -- Elements of Reusable Object-Oriented Software », Addison-Wesley, 1995.
Thierry Duval, Laurence Nigay :«Implémentation d’une application de simulation selon le modèle PAC-Amodeus», IHM 99, Montpellier, France, novembre 1999.
Thierry Duval, François Pennaneac’h :«Using the PAC-Amodeus Model and Design Patterns to Make Interactive an Existing Object-Oriented Kernel», TOOL’S Europe 2000, IEEE, Le Mont Saint-Michel, France, juin 2000.
Frantz Degrigny, Thierry Duval :«Utilisation du modèle PAC-Amodeus pour une réutilisation optimale de code dans le développement de plusieurs versions d’un logiciel commercial», IHM 2004, ACM, Namur, Belgique, septembre 2004.
Thierry Duval :«Méthode d'implémentation efficace des modèles PAC et PAC-Amodeus», tutorial à IHM 2005, Toulouse, France, septembre 2005.
Thierry Duval, Jean-Claude Tarby :«Améliorer la conception des applications interactives par l'utilisation conjointe du modèle PAC et des patrons de conception», IHM 2006, ACM, Montréal, Canada, avril 2006.
Thierry Duval :«Améliorer la conception des applications interactives par l’utilisation conjointe du modèle PAC-Amodeus et des patrons de conception Proxy, Fabrique Abstraite, et Singleton», tutorial à IHM 2009, Grenoble, France, octobre 2009.