vendredi 5 août 2016

Design pattern: avoid switch to decide which service call

For a project, we have a Controller/Service/DAO architecture. We implement calls to different providers' APIs so we ended up with some boilerplate code like in every controller:

public class MyController{
    @Resource ProviderService searchServiceProvider1;
    @Resource ProviderService searchServiceProvider2;
    @Resource ProviderService searchServiceProvider3;

    public search(InputForm form){
        switch(form.getProvider()){
           case PROVIDER_1: searchServiceProvider1.search();
                            break;
           case PROVIDER_2: searchServiceProvider2.search();
                            break;
           case PROVIDER_3: searchServiceProvider3.search();
                            break;
        }
    }

    public other(InputForm form){
        switch(form.getProvider()){
           case PROVIDER_1: searchServiceProvider1.other();
                            break;
           case PROVIDER_2: searchServiceProvider2.other();
                            break;
           case PROVIDER_3: searchServiceProvider3.other();
                            break;
        }
    }
}

Which design pattern could I use to get rid of this switch in every controller? I would like something like

public class MyController {
    @Resource ServiceStrategy serviceStrategy;

    public search(InputForm form){
        serviceStrategy.search(form.getProvider())
        // or
        serviceStrategy.ivoke(SEARCH, form.getProvider())
    }

    public other(InputForm form){
        serviceStrategy.other(form.getProvider())
        // or
        serviceStrategy.ivoke(OTHER, form.getProvider())
    }
}

letting the serviceStrategy decide the search service implementation to be called, and thus having the provider's switch in a single place.

I've used the term "strategy" because I've been told this design pattern could make it, but I'm not sure of the best way to use it or if there is a better approach to solve this problem.

Aucun commentaire:

Enregistrer un commentaire