Stavo leggendo un articolo di programmazione e menzionava il modello Decorator. Ho programmato per un po ', ma senza alcun tipo di istruzione o formazione formale, ma sto cercando di conoscere gli schemi standard e simili.
Quindi ho cercato il decoratore e ho trovato un articolo di Wikipedia su di esso. Ora capisco il concetto del modello Decorator, ma ero un po 'confuso da questo passaggio:
Ad esempio, considera una finestra in un sistema a finestre. Per consentire lo scorrimento del contenuto della finestra, potremmo voler aggiungere barre di scorrimento orizzontali o verticali, come appropriato. Supponiamo che le finestre siano rappresentate da istanze della classe Window e che questa classe non abbia funzionalità per l'aggiunta di barre di scorrimento. È possibile creare una sottoclasse ScrollingWindow che li fornisce oppure creare un ScrollingWindowDecorator che aggiunge questa funzionalità agli oggetti Window esistenti. A questo punto, entrambe le soluzioni andrebbero bene.
Ora supponiamo che desideriamo anche la possibilità di aggiungere bordi alle nostre finestre. Ancora una volta, la nostra classe Window originale non ha supporto. La sottoclasse ScrollingWindow ora presenta un problema, poiché ha effettivamente creato un nuovo tipo di finestra. Se desideriamo aggiungere il supporto dei bordi a tutte le finestre, dobbiamo creare sottoclassi WindowWithBorder e ScrollingWindowWithBorder. Ovviamente, questo problema peggiora con ogni nuova funzionalità da aggiungere. Per la soluzione di decorazione, creiamo semplicemente un nuovo BorderedWindowDecorator: in fase di esecuzione, possiamo decorare le finestre esistenti con ScrollingWindowDecorator o BorderedWindowDecorator o entrambi, a nostro avviso.
OK, quando dicono di aggiungere bordi a tutte le finestre, perché non aggiungere semplicemente funzionalità alla classe Window originale per consentire l'opzione? Per come la vedo io, la sottoclasse è solo per aggiungere funzionalità specifiche a una classe o sovrascrivere un metodo di classe. Se avessi bisogno di aggiungere funzionalità a tutti gli oggetti esistenti, perché non dovrei semplicemente modificare la superclasse per farlo?
C'era un'altra riga nell'articolo:
Il motivo decorativo è un'alternativa alla sottoclasse. La sottoclasse aggiunge comportamento al momento della compilazione e la modifica influisce su tutte le istanze della classe originale; la decorazione può fornire un nuovo comportamento in fase di esecuzione per singoli oggetti.
Non capisco dove si dice "... la modifica interessa tutte le istanze della classe originale" - in che modo la sottoclasse cambia la classe genitore? Non è questo il punto della sottoclasse?
Presumo che l'articolo, come molti Wiki, non sia stato scritto chiaramente. Riesco a vedere l'utilità di Decorator in quest'ultima riga: "... fornisce un nuovo comportamento in fase di esecuzione per singoli oggetti".
Senza aver letto questo schema, se avessi dovuto modificare il comportamento in fase di esecuzione per singoli oggetti, avrei probabilmente incorporato alcuni metodi nella super o sottoclasse per abilitare / disabilitare detto comportamento. Per favore, aiutami a capire davvero l'utilità di Decorator e perché il mio modo di pensare per principianti è imperfetto?