Mi sono imbattuto nel seguente modello di progettazione dello stato che sembra estremamente logico e semplice da implementare:
class CeilingFanPullChain
{
    private State m_current_state;
    public CeilingFanPullChain()
    {
        m_current_state = new Off();
    }
    public void set_state(State s)
    {
        m_current_state = s;
    }
    public void pull()
    {
        m_current_state.pull(this);
    }
}
interface State
{
  void pull(CeilingFanPullChain wrapper);
}
class Off implements State
{
    public void pull(CeilingFanPullChain wrapper)
    {
        wrapper.set_state(new Low());
        System.out.println("   low speed");
    }
}
class Low implements State
{
    public void pull(CeilingFanPullChain wrapper)
    {
        wrapper.set_state(new Medium());
        System.out.println("   medium speed");
    }
}
class Medium implements State
{
    public void pull(CeilingFanPullChain wrapper)
    {
        wrapper.set_state(new High());
        System.out.println("   high speed");
    }
}
class High implements State
{
    public void pull(CeilingFanPullChain wrapper)
    {
        wrapper.set_state(new Off());
        System.out.println("   turning off");
    }
}
public class StateDemo
{
    public static void main(String[] args)
    {
        CeilingFanPullChain chain = new CeilingFanPullChain();
        while (true)
        {
            System.out.print("Press ");
            get_line();
            chain.pull();
        }
    }
    static String get_line()
    {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in))
          ;
        String line = null;
        try
        {
            line = in.readLine();
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
        return line;
    }
}
 La mia preoccupazione è se sia ragionevole passare l'intero riferimento   CeilingFanPullChain    agli oggetti stato. Mi è sempre stato insegnato a passare solo ciò che è necessario. Ad esempio, potrei desiderare di avere metodi e campi che non sono utili per gli oggetti di stato, quindi passare l'intero riferimento all'oggetto è sensato? 
C'è un altro modo per riassegnare lo stato in CeilingFanPullChain, o questo non è un problema?