Je lisais un article de programmation et il mentionnait le modèle Decorator. Je programme depuis un certain temps, mais sans aucune sorte d'éducation ou de formation formelle, mais j'essaie d'en apprendre davantage sur les modèles standard et autres.
J'ai donc recherché le décorateur et trouvé un article Wikipedia à ce sujet. Je comprends maintenant le concept du motif Decorator, mais j'étais un peu confus par ce passage:
Par exemple, considérons une fenêtre dans un système de fenêtrage. Pour permettre le défilement du contenu de la fenêtre, nous pouvons souhaiter lui ajouter des barres de défilement horizontales ou verticales, selon le cas. Supposons que les fenêtres sont représentées par des instances de la classe Window et supposons que cette classe n'a aucune fonctionnalité pour ajouter des barres de défilement. Nous pourrions créer une sous-classe ScrollingWindow qui les fournit, ou nous pourrions créer un ScrollingWindowDecorator qui ajoute cette fonctionnalité aux objets Window existants. À ce stade, l'une ou l'autre solution conviendrait.
Supposons maintenant que nous souhaitons également pouvoir ajouter des bordures à nos fenêtres. Encore une fois, notre classe Window d'origine ne prend pas en charge. La sous-classe ScrollingWindow pose maintenant un problème, car elle a effectivement créé un nouveau type de fenêtre. Si nous souhaitons ajouter un support de bordure à toutes les fenêtres, nous devons créer des sous-classes WindowWithBorder et ScrollingWindowWithBorder. De toute évidence, ce problème s'aggrave avec chaque nouvelle fonctionnalité à ajouter. Pour la solution de décoration, nous créons simplement un nouveau BorderedWindowDecorator - au moment de l'exécution, nous pouvons décorer les fenêtres existantes avec le ScrollingWindowDecorator ou le BorderedWindowDecorator ou les deux, comme bon nous semble.
OK, quand ils disent d'ajouter des bordures à toutes les fenêtres, pourquoi ne pas simplement ajouter des fonctionnalités dans la classe Window d'origine pour permettre l'option? Pour moi, le sous-classement consiste simplement à ajouter des fonctionnalités spécifiques à une classe ou à remplacer une méthode de classe. Si j'avais besoin d'ajouter des fonctionnalités à tous les objets existants, pourquoi ne modifierais-je pas simplement la superclasse pour le faire?
Il y avait une autre ligne dans l'article:
Le motif décorateur est une alternative au sous-classement. Le sous-classement ajoute un comportement au moment de la compilation et la modification affecte toutes les instances de la classe d'origine; la décoration peut fournir un nouveau comportement au moment de l'exécution pour des objets individuels.
Je n'arrive pas là où ils disent "... le changement affecte toutes les instances de la classe d'origine" - comment le sous-classement change-t-il la classe parente? N'est-ce pas là tout l'intérêt du sous-classement?
Je vais supposer que l'article, comme de nombreux Wiki, n'est tout simplement pas écrit clairement. Je peux voir l'utilité du décorateur dans cette dernière ligne - "... fournir un nouveau comportement au moment de l'exécution pour les objets individuels."
Sans avoir lu ce modèle, si j'avais besoin de changer le comportement au moment de l'exécution pour des objets individuels, j'aurais probablement intégré certaines méthodes dans la super ou sous-classe pour activer / désactiver ledit comportement. S'il vous plaît, aidez-moi à vraiment comprendre l'utilité du décorateur et pourquoi ma pensée de débutant est défectueuse?