Una strategia può essere implementata come classe membro annidata?

3

Va bene avere una strategia implementata come una classe interna non statica o è considerata una cattiva pratica?

public class SomeClass{

  private final Strategy strategy;

  public void someMethod(){
   this.strategy = new Strategy();
   //call some strategy method to run an algorithm
    strategy.doSomeWork();
  }

  private class Strategy(){
    private doWork(){};
  }
}

P.S : Strategy ha bisogno di accedere allo stato di SomeClass . Quindi non può renderlo statico. Un'altra opzione è quella di avere Strategy come interfaccia e quindi iniettare un% diStrategy concreto all'interno del costruttore di SomeClass ma al momento non vedo questo particolare Interfaccia Strategy utilizzata da un'altra classe. Quindi pensato al primo approccio. Tuttavia, se faccio il primo approccio, come faccio a far funzionare la mia classe in modo trasparente con più strategie?

    
posta Subhra 28.03.2013 - 20:18
fonte

1 risposta

2

Penso che la tua strategia di classe interna debba essere statica perché non deve funzionare direttamente con lo stato della tua classe. Questo è il modo in cui penso che dovrebbe essere fatto.

public class ExampleClass
{
    private final ExampleStrategy strategy;
    private int state;

    public ExampleClass(final int initialState, final ExampleStrategy strategy)
    {
        this.state = initialState;
        this.strategy = strategy;
    }


    public void useStrategy()
    {
        this.state = this.strategy.modifyState(this.state);
    }


    public static interface ExampleStrategy
    {
        int modifyState(final int state);
    }

    public static class IncrementStrategy implements ExampleStrategy
    {

        @Override
        public int modifyState(final int state)
        {
            return state + 1;
        }

    }

    public static void main(final String[] args)
    {
        ExampleClass eClass = new ExampleClass(10, new IncrementStrategy());

        eClass.useStrategy();

    }
}
    
risposta data 31.03.2013 - 00:17
fonte

Leggi altre domande sui tag