Bonjour tout le monde,
Après avoir étudier des exemples du pattern "decorator" sur des pizzas et des cafés, j'ai voulut m'excercer à ce pattern.
Petite mise en situation de mon exemple :
On s'intéresse à un voxel d'une image médicale. Ce voxel peut avoir plusieurs types différents en fonction de si c'est une image d'IRM, ou d'un scanner, ou d'une TEP par exemple. Et ce même voxel peut avoir une à plusieurs valeurs possibles.
Du coup je me suis dit : bah voila un bel exemple pour faire du decorator. Voila ce que j'ai déjà fait :
Le voxel :
Un premier Decorator :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public abstract class Voxel { protected int x; protected int y; protected int z; protected String description = "voxel"; public Voxel(int x, int y, int z) { } public Voxel() { } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public int getZ() { return z; } public void setZ(int z) { this.z = z; } public String getDescription() { return description; } }
Un type de voxel issue de ce decorator :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public abstract class ModalityDecorator extends Voxel { public abstract String getDescription(); }
Un autre type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 public class MRI_Voxel extends ModalityDecorator{ protected int x; protected int y; protected int z; protected String description; public MRI_Voxel(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } public MRI_Voxel() { this.x = 0; this.y = 0; this.z = 0; } public String getDescription() { return this.description + ", MRI"; } }
Le deuxieme Decorator pour la ou les valeurs du voxel :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public class PET_Voxel extends ModalityDecorator{ protected int x; protected int y; protected int z; protected String description; /** * * @param x * @param y * @param z */ public PET_Voxel(int x, int y, int z) { this.x = x; this.y = y; this.z = z; } /** * */ public PET_Voxel() { this.x = 0; this.y = 0; this.z = 0; } public String getDescription() { return this.description + ", PET"; } }
Et la decoration qui correspond au fait qu'un voxel possède une seule valeur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public abstract class Voxel_Decorator extends Voxel { protected Voxel voxel; public Voxel_Decorator(Voxel voxel) { this.voxel = voxel; } public abstract String getDescription(); }
Ca à l'air de marcher, mais je voudrai aller encore plus loin et c'est là que je ne sais pas si mon idée est possible ou tout bonnement infaisable et hérétique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public class ScalarVoxel extends Voxel_Decorator{ /** * */ float value; /** * * @param p */ public ScalarVoxel(Voxel p) { super(p); } public String getDescription() { return voxel.getDescription() + ",Scalare"; } public float getValue() { return value; } public void setValue(float val) { this.value = val; } }
En fait on voit qu'on a ici deux types de voxel, et chaque voxel aura des operations indépendante : on peut mesurer l'activité d'un voxel TEP mais ça n'a pas de sens pour un voxel MRI. Donc j'avais imaginé qu'en mettant dans la décoration du voxel TEP, une fonction setActivity, avoir accès à cette fonction simplement en faisant monObjetDecoré.setActivity(); et le hic ça ne va pas ce qui semble assez logique mais j'imaginais que ça serait possible avec la décoration.
Je peux avoir accès a la fonction setActivty avec voxPET.setActivity(), bon logique, mais j'aimerai en fait y avoir accès depuis voxScalPET pour tout regrouper.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 PET_Voxel voxPET = new PET_Voxel(); ScalarVoxel voxScalPET = new ScalarVoxel(voxPET);
Je ne sais pas si c'est possible avec le pattern decorator de le faire, peut être dois je monter ma décoration autrement.
Auriez vous une idée?
Partager