Come ottenere un riferimento ad un AssetLoader centrale in ogni Widget?

1

Sto lavorando a un semplice sistema di interfaccia utente per un gioco. Gli elementi costitutivi sono oggetti Widget , che possono contenerli a vicenda. Esistono diverse sottoclassi di Widget , ad es. LabelWidget , ImageWidget e ButtonWidget .

Poiché la nidificazione è possibile, un ButtonWidget non è altro che un contenitore per LabelWidget e ImageWidget . Sono abbastanza contento di questo.

Il problema è: ora ho bisogno di usare un AssetLoader per caricare le immagini, non le posso ottenere direttamente dal disco. Esistono più implementazioni di AssetLoader , una per ogni piattaforma su cui è in esecuzione il gioco e solo una istanza viene creata in anticipo. E ha stato.

Quindi ora ho bisogno di passare un oggetto AssetLoader in ImageWidget . E in ButtonWidget , poiché contiene ImageWidget . E così via. Ho aggiornato il codice e ora ho bisogno di passare un asset loader in quasi tutti i widget, e davvero non mi piace quello che vedo.

Ho studiato alcune basi di codice dei framework UI che mi piacciono e ho notato che Android ha qualcosa di simile: C'è un oggetto Context che viene passato in ogni vista, che può essere usato per caricare risorse. Ma dal momento che le viste di solito sono istanziate magicamente da XML, non è così fastidioso da usare come quello che ho.

Posso pensare a una sola via d'uscita: crea un singleton che non fa altro che offrire un riferimento al patore di risorse, ad es. %codice%. Ma non sono convinto che questo non sia in realtà peggiore di quello che ho.

Riesci a pensare a qualsiasi soluzione elegante e remota per questo? Si noti che l'utilizzo di un framework per le dipendenze non è un'opzione per me.

    
posta futlib 17.01.2013 - 17:23
fonte

1 risposta

1

Se tutti i widget hanno un riferimento al loro widget contenitore, implementa un metodo per chiedere al contenitore AssetLoader o Context se non hanno il loro; quindi puoi semplicemente impostarlo sul widget del contenitore di livello superiore e sarà disponibile per l'intera gerarchia.

Ci sono delle varianti su come potrebbe essere implementato, ma ecco una versione semplice in Java:

public abstract class Widget {
    private Widget container;
    private AssetLoader assetLoader;

    protected AssetLoader getAssetLoader() {
        if (assetLoader == null) {
            return container.getAssetLoader();
        }
        return assetLoader;
    }
}

public class LabelWidget extends Widget {
    private String labelKey;

    public String getLabel() {
        getAssetLoader().getLabel(labelKey);
    }
}
    
risposta data 18.01.2013 - 15:06
fonte