tl; dr
È lo schema di strategia menzionato prima da Cameron MacFarland.
Ma ho anche qualche problema con la tua domanda.
L'interfaccia del tuo nodo non sta usando i generici. Pertanto, per utilizzare un nodo è necessario conoscere il tipo di nodo che si sta tentando di utilizzare (file nell'esempio).
Quindi, se risolviamo questo problema aggiungendo il nodo, i due esempi diventano più chiari.
Ora quello che vediamo è che entrambi sono molto simili con l'eccezione che il Node è statico vs stateless come nel NodeWorker.
Puoi vederlo chiaramente aggiungendo un veloce:
T getAdapted () all'interfaccia del nodo.
Ora hai praticamente lo stesso codice del NodeWorker con una riga di codice in più ma un metodo grandParent leggermente (probabilmente) più pulito.
Per quanto riguarda il numero di classi che devi implementare usando questo nuovo Nodo vs il tuo NodeWorker? È esattamente lo stesso ora.
Quindi ora la domanda diventa una domanda in più parti.
Se si desidera un adattatore, non si dovrebbe mai sapere realmente quale adattatore si stava adattando (idealmente). Perché l'adattatore è il tuo modo "standard" per interagire con più sottosistemi che non vuoi dover gestire.
Questo significa che non dovresti mai sapere quale tipo di oggetto è stato effettivamente adattato. Cosa volevi fare con il file? Cosa vorresti fare con la modifica del file se stavi usando qualche altro tipo di nodo? In caso contrario, aggiungere i metodi di interazione necessari all'interfaccia nodo.
Qual è il vantaggio di ciò? Il vantaggio è che il Nodo NON ha bisogno di tipi generici e può effettivamente restituire altri tipi di NODI senza doverli informare o curare i clienti.
Ad esempio supponiamo di avere tipi di file tipi di directory e tipi di dischi.
la chiamata a grandParent potrebbe in teoria restituire Directory come genitore di un file e Disc come padre della Directory che in sostanza restituire DirectoryNodeAdapter e DiscNodeAdapter tutti sotto l'interfaccia di Node senza che il client debba preoccuparsi di questo!
Metodi comuni (diciamo eliminazione) potrebbero essere aggiunti all'interfaccia e non ti dovrai mai preoccupare del fatto che si trattava di una directory o di un disco o di un file da eliminare mentre gli adattatori del nodo ne estraevano la distanza.
La tua strategia NodeWorker non avrà questa capacità come è stata digitata nel primo tipo di file e la chiamata del nonno presuppone che questo stesso tipo verrà restituito
(Questo può essere modificato nell'interfaccia della strategia, ovviamente).
Fondamentalmente ciò che si riduce a è il tuo caso d'uso.
Personalmente mi piace usare il modello di strategia quando si lavora con il set di oggetti SAME, ma le specifiche di come voglio gestirle durante lo svolgimento delle attività SAME varieranno.
Un buon esempio di ciò sarebbe l'interfaccia di Comparator in java, dove so che ho a che fare con un insieme di oggetti e so che ho bisogno di variare (o cambiare) come li paragono.
Personalmente uso schemi di adattatori quando voglio nascondere il sistema sottostante, se prima o poi volessi sostituire il sistema sottostante.
Un buon esempio di ciò è java jdbc e l'architettura di plugin di eclipse.