Salut.
J'aimerai bien connaitre la difference entre "decorator pattern" et "composit pattern".
Merci
Version imprimable
Salut.
J'aimerai bien connaitre la difference entre "decorator pattern" et "composit pattern".
Merci
Un décorateur (peut) ajoute(r) un comportement à une entité sans en changer ni la nature, ni la signature, ni le comportement.
La composition fédère la signature de modules qui composent un ensemble relationnel afin de pouvoir s'assurer de l'adhérence de chacun des éléments. Donc l'ensemble présente la même interface que ses éléments satellitaires.
Un exemple de composition:
Code:
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 namespace CompositePattern { using System; using System.Collections.Generic; using System.Linq; //Client class Program { static void Main(string[] args) { // initialize variables var compositeGraphic = new CompositeGraphic(); var compositeGraphic1 = new CompositeGraphic(); var compositeGraphic2 = new CompositeGraphic(); //Add 1 Graphic to compositeGraphic1 compositeGraphic1.Add(new Ellipse()); //Add 2 Graphic to compositeGraphic2 compositeGraphic2.AddRange(new Ellipse(), new Ellipse()); /*Add 1 Graphic, compositeGraphic1, and compositeGraphic2 to compositeGraphic */ compositeGraphic.AddRange(new Ellipse(), compositeGraphic1, compositeGraphic2); /*Prints the complete graphic (four times the string "Ellipse").*/ compositeGraphic.Print(); Console.ReadLine(); } } //Component public interface IGraphic { void Print(); } //Leaf public class Ellipse : IGraphic { //Prints the graphic public void Print() { Console.WriteLine("Ellipse"); } } //Composite public class CompositeGraphic : IGraphic { //Collection of Graphics. private readonly List<IGraphic> graphics; //Constructor public CompositeGraphic() { //initialize generic Colleciton(Composition) graphics = new List<IGraphic>(); } //Adds the graphic to the composition public void Add(IGraphic graphic) { graphics.Add(graphic); } //Adds multiple graphics to the composition public void AddRange(params IGraphic[] graphic) { graphics.AddRange(graphic); } //Removes the graphic from the composition public void Delete(IGraphic graphic) { graphics.Remove(graphic); } //Prints the graphic. public void Print() { foreach (var childGraphic in graphics) { childGraphic.Print(); } } } }
Est il possible que dans certains cas les deux patterns soient appropriés?
PS: voire attachement.
Possible? Oui. Approprié? C'est subjectif.
Personnellement, j'utilise la décoration pour les 'cross cutting concerns'.
Aussi, je prévilégie la composition à l'héritage, probablement à cause de ma spécialisation dans le développement de SDK et de services web.
Mais en cherchant un peu sur le web, tu trouveras des gens qui diront le contraire...