Questo è un buon modo per implementare lo schema di stato?

2

Vorrei sapere se il codice seguente è una buona implementazione del modello di progettazione dello stato. Ovunque vedo il modello di stato per mantenere il contesto e un cambiamento di stato non restituisce nulla. Ma nel mio esempio qui sotto, restituisco il nuovo stato (cioè Nord / Est, così via ...). Si prega di rivedere e aiutare.

public abstract class Direction
{
    public abstract Direction Right();


    public abstract Direction Left();
}


public sealed class East : Direction
{

    public East()

    { }


    public override Direction Left()
    {
        return new North();
    }


    public override Direction Right()
    {
        return new South();
    }

    public override string ToString()
    {
        return "EAST";
    }
}

Allo stesso modo per altre direzioni.

Grazie mille.

    
posta Deepak 11.03.2017 - 10:16
fonte

1 risposta

3

Questo non è un esempio del modello di stato, ma ci sei quasi.

Il problema con il modo in cui lo hai ora può essere dimostrato con questo esempio:

void Turn(Direction d, int degrees)
{
    switch (degrees)
    {
        case 90: d = d.Right();
        case -90: d = d.Left();
    }
}

void Example()
{
    Direction d = new East();
    Turn(d, 90);
    Turn(d, 90);
    Console.WriteLine(d.ToString());  //Prints East.  Should print West!!!
}

Il problema è che la classe in realtà non contiene uno stato che ti dice quale direzione deve affrontare. è lo stato. Quindi se cambi direzione, in qualche modo devi tornare indietro e cambiare ogni riferimento all'oggetto a qualcos'altro. se non lo fai, lo stato è perso.

Una corretta implementazione dello schema di stato include un contenitore:

class DirectionState 
{
    private Direction _state;

    public DirectionState(Direction initialDirection) { _state = initialDirection; }

    public void Left()  { _state = _state.Left(); }
    public void Right() { _state = _state.Right();}
    public string ToString() { return _state.ToString(); }
}

Quindi funzionerebbe:

void Turn(DirectionState d, int degrees)
{
    switch (degrees)
    {
        case 90: d = d.Right();
        case -90: d = d.Left();
    }
}

void Example()
{
    DirectionState d = new DirectionState(new East());
    Turn(d, 90);
    Turn(d, 90);
    Console.WriteLine(d.ToString());  //Prints West
}
    
risposta data 14.03.2017 - 01:14
fonte

Leggi altre domande sui tag