Devo utilizzare il modello di progettazione stato per solo due stati? Inoltre, cosa succede se lo stato di un oggetto è influenzato da un altro stato?

3

Se hai solo due stati per un oggetto, ne vale la pena usare ancora il modello State Design?

Il contesto è un ambiente di gioco multigiocatore a turni in cui ci sono "tavoli" di giochi a cui un giocatore può partecipare, entrando o uscendo da un posto.

Quindi, mi sono concentrato sull'oggetto Seat da avviare, come un modo per provare ad implementare la formazione recente sui modelli di design.

In generale, il Posto ha due stati: Libero o Occupato. Quando un posto è libero, un giocatore può parteciparvi. Quando un posto è occupato, nessun altro giocatore può unirsi e solo il giocatore che ha già aderito, può andarsene.

Questo mi porta alla mia altra domanda ... e se uno degli stati del Posto è influenzato da uno stato in un altro oggetto, il Gioco.

L'oggetto Game avrà anche vari stati. Un esempio di questo è, quando tutti e 4 i giocatori si uniscono al tavolo e premi Start, il gioco è considerato IN CORSO.

Di conseguenza, se un giocatore lascia un posto in questo momento, ad esempio, essendo disconnessi, il sedile entra in uno stato "terzo" che è uno stato di pausa in cui lo spot è riservato per quel giocatore per tornare ... ma se il gioco NON è in corso, il giocatore può lasciare il posto liberamente e non è riservato.

Come si modellerebbe la relazione tra i due stati? Vorresti aggiungere un terzo stato negli Stati Uniti che può avere un posto?

O c'è un contesto genitore che ha sia un riferimento a GameState che un riferimento a SeatState e lo "stato extra" è gestito lì?

Qualsiasi aiuto o intuizione nella giusta direzione sarebbe molto apprezzato.

    
posta Sean 06.05.2015 - 17:34
fonte

1 risposta

2

L' articolo di Wikipedia per lo State Pattern ha un esempio Java che illustra due stati, che coinvolgono due metodi diversi. Questi metodi possono essere arbitrariamente complessi, quindi considero perfettamente una soluzione a due stati (nessun gioco di parole)

interface Statelike {
    void writeName(StateContext context, String name);
}

class StateLowerCase implements Statelike {
    @Override
    public void writeName(final StateContext context, final String name) {
        System.out.println(name.toLowerCase());
        context.setState(new StateMultipleUpperCase());
    }
}

class StateMultipleUpperCase implements Statelike {
    /** Counter local to this state */
    private int count = 0;

    @Override
    public void writeName(final StateContext context, final String name) {
        System.out.println(name.toUpperCase());
        /* Change state after StateMultipleUpperCase's writeName() gets invoked twice */
        if(++count > 1) {
            context.setState(new StateLowerCase());
        }
    }
}

Tieni presente che writeName sostituisce la propria implementazione assegnando un nuovo oggetto StateLike a StateContext quando il conteggio i supera uno.

class StateContext {
    private Statelike myState;
    StateContext() {
        setState(new StateLowerCase());
    }

    /**
     * Setter method for the state.
     * Normally only called by classes implementing the State interface.
     * @param newState the new state of this context
     */
    void setState(final Statelike newState) {
        myState = newState;
    }

    public void writeName(final String name) {
        myState.writeName(this, name);
    }
}

Un pattern di stato sarebbe indicato se il tuo "macchinario" cambia sostanzialmente tra gli stati. La complessità della condizione necessaria per scegliere l'oggetto di elaborazione corretto non ha importanza; è la complessità degli oggetti di stato stessi che sono il fattore decisivo. Altrimenti, potresti semplicemente scrivere tutta la logica in una singola classe.

Pensa a cosa succede quando costruisci un'auto. Il telaio si muove lungo una linea di assemblaggio e si ferma in una stazione in cui avviene la saldatura. Una volta completato lo stato, il telaio si sposta sulla successiva stazione sulla linea di assemblaggio, dove un diverso set di robot con programmazione completamente diversa installa il motore.

    
risposta data 06.05.2015 - 17:56
fonte