Quale modello dovrei usare per creare un personaggio?

4

Ho un'applicazione che consente agli utenti di creare il proprio personaggio da capi di abbigliamento come cappello, pantaloni e tratti del viso, come barba e occhi. Sto usando una tela per mostrare il personaggio costruito. L'ordine con cui questi articoli vengono disegnati è importante, es. il corpo del personaggio dovrebbe apparire dietro i pantaloni.

La mia insegnante mi ha detto di usare il pattern Composite per memorizzare gli oggetti che sono attualmente sul personaggio e per disegnare il mio personaggio nell'ordine corretto con l'uso del pattern Decorator.

Attualmente ho due elenchi, uno che contiene le caratteristiche facciali e uno per i vestiti. Non riesco a immaginare un modo per far funzionare il disegno con il pattern Decorator, l'unico modo che vedo è in realtà difficile: codificare l'ordine in questo modo: creare un personaggio, creare un decoratore CharacterWithBody e aggiungerlo immediatamente al mio personaggio, che vale a dire. crea un decoratore CharacterWithHat e aggiungilo al personaggio, ma per ora non conterrebbe alcuna immagine di alcun cappello, sarebbe fondamentalmente vuoto. Più tardi, quando aggiungo un oggetto al personaggio completamente decorato, attraverso la classe dell'oggetto aggiunto, saprei quale decoratore dovrebbe memorizzare l'immagine (o qualsiasi informazione).

Quindi in pratica questo sarebbe il mio carattere iniziale:

character -> bodyDec -> eyesDec -> mouthDec -> beardDec (empty) -> hatDec(empty)...

Penso che potrebbe funzionare, ma non credo che questo sarebbe un buon approccio. Qualsiasi consiglio sarebbe utile. Grazie!

    
posta user3357969 19.11.2016 - 15:06
fonte

2 risposte

1

Vuoi costruire il tuo personaggio in codice o vuoi rendere facile per un utente del tuo software creare un personaggio usando un'interfaccia? Questi sono casi di utilizzo molto diversi. Finché non dici diversamente, presumo che tu voglia semplicemente creare codice.

Non sono sicuro del motivo per cui utilizzeresti sia lo schema composito sia quello decoratore qui. O sembra fare il lavoro.

Lo schema del decoratore ti consente di scrivere codice di costruzione simile a questo:

Character exampleCharacter =
   new HatDefault(
   new BeardDefault(
   new MouthDefault(
   new EyesDefault(
   new BodyDefault(
   new CharacterDefault()
   )))));

L'interfaccia Character avrebbe un metodo display() in modo da poter chiamare exampleCharacter.display() e Hat lo vedrebbe per primo, girarsi e chiamare display() su Beard , quindi Hat attenderebbe Beard per tornare, una volta Beard restituisce una barba, e tutto il resto, dovrebbe essere parte dell'immagine e Hat ora può disegnare un cappello sopra l'immagine.

Il pattern composito ti consente di scrivere codice di costruzione simile a questo:

Character exampleCharacter = new CharacterDefault();
exampleCharacter.add( new HatDefault() );

Character face = new FaceDefault();    
face.add( new MouthDefault() );
face.add( new BeardDefault() );
face.add( new EyesDefault() );

exampleCharacter.add( face );
exampleCharacter.add( new BodyDefault() );

Ancora una volta chiameresti exampleCharacter.display() per disegnare questa immagine. Questa volta, invece della chiamata che passava dal decoratore al decoratore in linea retta, avremmo attraversato la struttura. CharacterDefault sarebbe il primo a vedere la chiamata display. Andrebbe in loop per chiamare tutti i membri di Character nella sua collezione: body, face, hat. Quando arrivò alla faccia, il viso passava attraverso la sua collezione: bocca, barba, occhi.

Ciascuno ti consente di controllare l'ordine in cui vengono disegnate le cose. Composito ti consente di gestire elenchi secondari.

Non vedo una buona ragione per riunirli qui.

    
risposta data 19.11.2016 - 16:02
fonte
-2

Prima di tutto ...

I pattern non sono fatti da te o ti sono stati dati. Sono stati identificati dalla percezione del dominio del problema.

Se il tuo insegnante ti ha detto di usare il modello X e Y, allora ha fatto alcune ipotesi che devi sapere dato che abbiamo uno spazio di soluzione arbitrario per ogni problema. Il punto è: qual è la sua idea e il riferimento per giungere a questa conclusione?

Non sono sostanzialmente in disaccordo sui suggerimenti fatti dal tuo insegnante. Forse ha attraversato un processo per identificare quali modelli ha identificato nel dominio del problema.

Alcuni pensieri ...

I tuoi occhi trattengono il tuo corpo o il corpo ti tiene gli occhi? L'ipotesi che farei è che il tuo corpo ti tenga gli occhi. Ma questa è una decisione arbitraria, anche se a me sembra plausibile.

Forse vuoi distinguere tra il tuo corpo e la tua testa. Forse i tuoi occhi ti trattengono la testa? Sono convinto, viceversa. Ma ancora una volta è un'ipotesi che ho fatto.

Se segui questo percorso, potresti inventare qualcosa del genere: il tuo corpo è costituito da una testa, un busto, due gambe, due braccia. La tua testa è composta da due occhi, una bocca, un naso, due orecchie. Entrambe le braccia sono costituite da un braccio superiore, un avambraccio e una mano. Una mano è composta da 5 dita. Un dito consiste in ...

Queste sono tutte ipotesi della mia percezione della realtà e il mio modo di modellarlo. Ad un certo punto ho omesso i dettagli perché non li vedo rilevanti. Io "astratto" da loro in quanto potrebbero non far parte del problema da risolvere.

Se costruisci il tuo corpo come questo ti viene in mente una struttura ad albero. Una struttura ad albero è correttamente mappata al "modello composito".

Se metto i vestiti, metterei prima una maglietta e poi un pullover. Potrei fare altrimenti anche mi sentirei strano. Lo stesso con le mie mutande e i miei jeans.

Per evitare quelle cose "strane" si introduce il presupposto che sia importante in quale ordine vengono messi i vestiti. Questa potrebbe essere una decisione di progettazione che vuoi applicare. Quindi vuoi ordinare in qualche modo. L'ordine può essere ottenuto attraverso un elenco.

Se indossi panni, gioielli o un orologio da polso, "decorerai" te stesso. Un avambraccio può contenere un orologio da polso, l'orecchio può tenere gli orecchini, il busto può contenere una maglietta, un maglione e una giacca in questo ordine.

Quindi ogni elemento del tuo corpo può avere una lista di decorazioni. Il fatto è che queste decorazioni potrebbero sovrapporsi e essere nuovamente composte. I tuoi pantaloni possono essere decorati con una cintura e fermagli per pantaloni. Quindi immagino che anche questo sarà un albero.

Scomposizione: il mio modello include una struttura ad albero del corpo, una struttura ad albero di elementi decorativi e una connessione tra di essi. Le strutture ad albero possono essere rappresentate con il modello composito, la connessione tra loro con il modello decoratore.

Infine ...

Dipende tutto se riesci ad afferrare il dominio del problema. Devi identificarne la struttura per identificare i modelli. L'abilità dipende dal pensiero logico e dai punti di riferimento da confrontare con (per esempio esperienza e percezione della realtà).

Quindi i miei pensieri possono differire per ragioni diverse dagli altri. Io ...

... potrebbe non avere una comprensione completa del dominio del problema

... avere una diversa (forse errata) percezione della realtà su questo argomento

... ha introdotto artefatti che sono irrilevanti

... omessi artefatti rilevanti

...

Raccomando vivamente di imparare l'applicazione del modello di progettazione. Non dovresti pensare a come implementarlo più una volta che sei sicuro di aver identificato il modello nel tuo dominio problematico.

    
risposta data 19.11.2016 - 16:17
fonte

Leggi altre domande sui tag