1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127 | S̳t̳r̳a̳t̳é̳g̳i̳e̳
1) Comportement difficile à mixer
2) Création d'objets selon les comportement
3) Factorisation non optimisée
Fonction de tri → stratégie multiple
┌───────────────────┐
│ Agrégat │ <<interface>>
├───────────────────┤ ┌───────────────────┐
│ +setTri(Tri) │ tri │ Tri │
│ +trier() │◊------------------>├───────────────────┤
│ +setMax(Max) │ │+faire(Agregat) │
│ +max() │ └───────────────────┘
└───────────────────┘ △
◊ |
| |
| ┌───────────────────┐
<<interface>> │ TriA │
┌───────────────────┐ ├───────────────────┤
│ Max │ │ │
├───────────────────┤ └───────────────────┘
│+faire(Agregat) │
└───────────────────┘
Agregat::trier() {
⋮
tri.faire(this);
⋮
}
Agregat::Agregat() {
⋮
tri = new TriA(); // ← tri par défaut
}
Exemple :
{
Agregat a = new Agregat();
// a.setTri(new TriA());
a.trier();
}
P̳r̳o̳x̳y̳
⎧ Objet distant
⎨ Accès à un objet à sécuriser (délicat)
⎩ Accès à un objet volumineux
→ Se substituer à une autre chose
◦ créer une classe proxy ayant la même interface que l'objet réel
◦ ajouter une association vers l'objet réel pour lui déléguer l'action réelle
<<interface>>
┌───────────────────┐
│ LaClasse │
├───────────────────┤
│ │
└───────────────────┘
△ △
/ \
/ \
/ \
/ \
/ \
/ \
<<proxy>> |
┌───────────────────┐ ┌───────────────────┐
│ Proxy │ │ LaClasseVrai │
├───────────────────┤ réel ├───────────────────┤
│ +m1() │----------->│ +m1() │
└───────────────────┘ └───────────────────┘
┌───────┐ ┌─────────────┐ ┌──────────────┐
│ Appli │ │ proxy:Proxy │ │ LaClasseVrai │
└───────┘ └─────────────┘ └──────────────┘
¦ ¦ ¦
¦ <<create>> ¦ ¦
-------------------------▷⫾ ¦
¦ ⫾ create ¦
¦ ⫾-------------------------------▷⫾
¦ ⫾ ⫾
¦ mc1 ⫾ ⫾
-------------------------▷⫾ ⫾
¦ ⫾ mc1() ⫾
¦ ⫾-------------------------------▷⫾
¦ ⫾ ⫾
¦ ⫾ ⫾
¦ ⫾ ⫾
C̳o̳m̳p̳o̳s̳i̳t̳e̳
⎧ Arbre binaire…
⎨ Gestion des fichiers et dossiers
Représente des arbres ⎨ Arbre des processus
⎨ XML/JSON
⎩ Gestion objet graphique (IHM avec des composants qui en contiennent d'autres)
<<abstract>>
┌───────────────────┐
* │ Component │
––––––––––––––––––––––––––––––––––├───────────────────┤
| children │ +paint() │
| └───────────────────┘
| △
| |
| –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––⋯⋯⋯
| | | |
| <<composite>> <<feuille>> <<feuille>>
| ┌──────────────────────────────┐ ┌──────────┐ ┌───────────┐
| │ Panel │ │ Button │ │ Textfield │
| ├──────────────────────────────┤ ├──────────┤ ├───────────┤
| │ +addComponent(Component) │ │ +paint() │ │ +paint() │
–––––◊│ +removeComponent(Component) │ └──────────┘ └───────────┘
│ +paint() │
│ +getChildren() : Component[] │
└──────────────────────────────┘
Panel::paint() {
for(Component c: children) {
c.paint();
}
}
|