Ho una serie di classi che rappresentano i widget in un sistema di layout. La classe base per tutti questi tipi di widget concreti è Widget
. Se ho un pulsante e una casella di testo, entrambi derivano da Widget
.
Il layout è strutturato come un albero. Ogni widget può avere solo 1 genitore e zero o più figli, che sono anche di tipo Widget
.
Alcuni di questi tipi di widget concreti devono condividere lo stato. Come esempio, diciamo che ogni widget determina il proprio colore di sfondo da un elenco di colori predeterminati, configurato dall'utente chiamato Theme
. Il tema generale dell'applicazione consente di definire i colori per ampie categorie di widget. Quando un widget deve sapere quale dovrebbe essere il suo colore di sfondo, ha bisogno di accedere attivamente alla stessa istanza di Theme
per effettuare la ricerca. Quindi, quello che trovo sono alcuni widget nel sistema (quelli che possono essere colorati, come il pulsante e la casella di testo) che richiedono l'accesso a un'istanza Theme
, ma ad altri widget non interessa il colore.
L'opzione 1 è fare in modo che il costruttore di Widget
prenda un riferimento al Theme
, che le sottoclassi possono scegliere di usare temporaneamente, memorizzare in modo permanente (per uso continuato), o non usare affatto. Il lato negativo di questo è che non tutte le sottoclassi dei widget si occupano dei temi, quindi è come avere una classe "Ostrich" derivata da una classe "Bird" con una funzione chiamata "Fly ()" (cioè non tutti gli uccelli volano).
L'opzione 2 è quella di utilizzare il modello visitatore. Dopo la costruzione di tutti i widget, usa lo schema visitatore con le sostituzioni per Button
e TextBox
per ottenere lo stato dall'oggetto visitatore per fare ciò che deve fare. Altri tipi di widget sarebbero "predefiniti" a non attivi nella classe visitatore avendo un terzo sovraccarico che prende il tipo di base Widget
.
C'è un'opzione 3 che è meglio? Qualche idea sulle 2 opzioni sopra? Qual è l'approccio giusto qui?