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();
}
}
|