Stavo leggendo un articolo di programmazione e menzionava il pattern Decorator. Ho programmato per un po ', ma senza alcun tipo di istruzione o formazione formale, ma sto cercando di conoscere i modelli standard e simili.
Così ho cercato il Decorator e ho trovato un articolo di Wikipedia su di esso. Ora capisco il concetto del pattern Decorator, ma sono stato un po 'confuso da questo passaggio:
As an example, consider a window in a windowing system. To allow scrolling of the window's contents, we may wish to add horizontal or vertical scrollbars to it, as appropriate. Assume windows are represented by instances of the Window class, and assume this class has no functionality for adding scrollbars. We could create a subclass ScrollingWindow that provides them, or we could create a ScrollingWindowDecorator that adds this functionality to existing Window objects. At this point, either solution would be fine.
Now let's assume we also desire the ability to add borders to our windows. Again, our original Window class has no support. The ScrollingWindow subclass now poses a problem, because it has effectively created a new kind of window. If we wish to add border support to all windows, we must create subclasses WindowWithBorder and ScrollingWindowWithBorder. Obviously, this problem gets worse with every new feature to be added. For the decorator solution, we simply create a new BorderedWindowDecorator—at runtime, we can decorate existing windows with the ScrollingWindowDecorator or the BorderedWindowDecorator or both, as we see fit.
OK, quando dicono di aggiungere bordi a tutte le finestre, perché non aggiungere semplicemente funzionalità nella classe Window originale per consentire l'opzione? Per come la vedo io, la sottoclasse serve solo per aggiungere funzionalità specifiche a una classe o per sostituire un metodo di classe. Se dovessi aggiungere funzionalità a tutti gli oggetti esistenti, perché non dovrei semplicemente modificare la superclasse per farlo?
C'era un'altra riga nell'articolo:
The decorator pattern is an alternative to subclassing. Subclassing adds behavior at compile time, and the change affects all instances of the original class; decorating can provide new behavior at run-time for individual objects.
Non capisco dove dicono "... la modifica riguarda tutte le istanze della classe originale" - come fa la sottoclasse a cambiare la classe genitore? Non è questo il punto della sottoclasse?
Suppongo che l'articolo, come molti Wiki, non sia stato scritto chiaramente. Riesco a vedere l'utilità del decoratore nell'ultima riga: "... fornisce un nuovo comportamento in fase di esecuzione per i singoli oggetti."
Senza aver letto su questo modello, se avessi avuto bisogno di cambiare comportamento in fase di esecuzione per singoli oggetti, avrei probabilmente creato alcuni metodi nella sottoclasse o sottoclasse per abilitare / disabilitare il suddetto comportamento. Per favore aiutami a capire davvero l'utilità del Decoratore, e perché il mio pensiero da principiante è imperfetto?