dimanche 11 juin 2017

how to pass appropriate dependencies to each state in state design patern?

i'm developing an android application and in a specific situation, i faced with problem to manage multiple state of behaviour of an object. I read about State Pattern and solve my problet with help of it.

but still some dark points exists to clear for me.my question is how pass appropriate dependencies to each state class?let me show you, what i do in my application. i create:

  1. a state Interface
  2. a context Class
  3. and three state-Class

this is first State-Class:

public class SnackBarArrangeItemsState implements SnackBarState {
    @Override
    public void doAction(SnackBarContext context, SnackBarStateView stateView, Languages language, int position) {
        switch (language) {
            case ENGLISH:
                stateView.setSpinnerItem(0);
                break;
            case PERSIAN:
                stateView.setSpinnerItem(1);
                break;
        }
        context.setState(new SnackBarChangeItemState());
    }
}

in this state, i did some operations and update the view by call:

stateView.setSpinnerItem(itemNumber);

and then change state:

context.setState(new SnackBarChangeItemState());

as you can see i pass two dependeny to this method:

Languages language, int position

this is my two state-Class:

class SnackBarChangeItemState implements SnackBarState {

        @Override
        public void doAction(SnackBarContext context, SnackBarStateView stateView, Languages language, int position) {
            switch (position) {
                case 0:
                    changeLanguageAndShowSnackBar(context, stateView, ENGLISH);
                    break;
                case 1:
                    changeLanguageAndShowSnackBar(context, stateView, PERSIAN);
                    break;
            }
            context.setState(new SnackBarAfterArrangeItemsState());
        }
    }

only positin variable used in this State.the below is my state class:

public class SnackBarContext {

    public SnackBarState getState() {
        return state;
    }

    public void setState(SnackBarState state) {
        this.state = state;
    }

    public SnackBarContext(SnackBarStateView stateView){
        this.stateView = stateView;
        this.state = new SnackBarArrangeItemsState();
    }

    public void manageSnackBar(Languages language, int position) {
        state.doAction(this, stateView, language, position);
    }

}

as you can see, only on method is responsible to change states and i must to pass all dependecies to it.(regardless of each state need theme or not) hot to avoid this situation.how to tell each stateclass to receive only needed dependency? Thanks.

Aucun commentaire:

Enregistrer un commentaire