mercredi 12 octobre 2016

Strategie Pattern too many if statements

A user enters a code and the type of that code is determined by regular expressions. There are many different type of codes, such as EAN, ISBN, ISSN and so on. After the type is detected, a custom query has to be created for the code. I thought it might be a good idea to create a strategie for type, but with time it feels wrong.

public interface SearchQueryStrategie {

    SearchQuery createSearchQuery(String code);
}

-

public class IssnSearchQueryStrategie implements SearchQueryStrategie {

    @Override
    public SearchQuery createSearchQuery(final String code) {
        // Create search query for issn number
    }
}

-

public class IsbnSearchQueryStrategie implements SearchQueryStrategie {

    @Override
    public SearchQuery createSearchQuery(final String code) {
        // Create search query for ISBN number
    }
}

-

public class EanShortNumberSearchQueryStrategie implements SearchQueryStrategie {

    @Override
    public SearchQuery createSearchQuery(final String code) {
        // Create search query for ean short number
    }
}

-

public class TestApplication {

    public static void main(final String... args) {
        final String code = "1144875X";

        SearchQueryStrategie searchQueryStrategie = null;
        if (isIssn(code)) {
            searchQueryStrategie = new IssnSearchQueryStrategie();
        } else if (isIsbn(code)) {
            searchQueryStrategie = new IsbnSearchQueryStrategie();
        } else if (isEan(code)) {
            searchQueryStrategie = new EanShortNumberSearchQueryStrategie();
        }

        if (searchQueryStrategie != null) {
            performSearch(searchQueryStrategie.createSearchQuery(code));
        }
    }

    private SearchResult performSearch(final SearchQuery searchQuery) {
        // perform search
    }

    // ...
}

I have to say that there are many more strategies. How should I dispatch the code to the right strategie? My second approach was to put a boolean method into every strategie to decide if the code is correct for that strategy.

public class TestApplication {

    final SearchQueryStrategie[] searchQueryStrategies = {new IssnSearchQueryStrategie(), new IsbnSearchQueryStrategie(),
            new EanShortNumberSearchQueryStrategie()};

    public static void main(final String... args) {
        final String code = "1144875X";

        for (final SearchQueryStrategie searchQueryStrategie : searchQueryStrategie) {
            if (searchQueryStrategie.isRightCode(code)) {
                searchQueryStrategie.createSearchQuery(code);
                break;
            }
        }
    }

    private SearchResult performSearch(final SearchQuery searchQuery) {
        // perform search
    }

    // ...
}

How would you solve this problem? Is the strategy pattern the right one for my purposes?

Aucun commentaire:

Enregistrer un commentaire