Шаблон креативного дизайна для этой проблемы? - PullRequest
1 голос
/ 17 августа 2011

У меня есть следующая проблема, проиллюстрированная псевдокодом ниже (может не иметь большого смысла):

class Form {
    boolean loggedOn = false;
    String id = null;
    ...get/set shared methods
}

class SearchFormA extends Form{
    String name = null;
    String email = null;

    ...get/set methods
}

class SearchFormB extends Form{
    String age = null;
    String gender = null;

    ...get/set methods
}

class Search {
    public Search(HttpServletRequest request){
            String searchMode = (String) request.getSearchMode();
        if("0".equals(searchMode)){
            SearchFormA formA = new SearchFormA();
            formA.setName((String)request.getParameter("name"));
            formA.setId((String)request.getParameter("id"));
            ...populate form
            request.getSession().setAttribute("formA",formA);
        }

        if("1".equals(searchMode)){
            SearchFormB formB = new SearchFormB();
            formB.setAge((String)request.getParameter("age"));
            formB.setId((String)request.getParameter("id"));
            ...populate form
            request.getSession().setAttribute("formB",formB);
        }

        ...rest of code
    }
}

Что я сделал, так это использовал отражение, но есть ли другой способ сделать это во время компиляции? Я также пробовал фабричный метод, но у классов SearchFormA и SearchFormB мало общего.

РЕДАКТИРОВАТЬ: хорошо в принципе, в этом случае у меня есть 4-5 поисковых режимов, каждый поисковый режим имеет свою форму. Между этими формами они разделяют определенные похожие поля. В будущем мне, возможно, придется добавить 10 searchModes, и он будет многократно заполняться одними и теми же полями.

Ответы [ 3 ]

2 голосов
/ 17 августа 2011

К сожалению, ваш код слишком "псевдо". Например, неясно, откуда вы берете searchMode. Также инициализация ваших конкретных форм жестко запрограммирована. Я считаю, что в реальной жизни все эти данные взяты из класса Data.

Итак, я предполагаю, что класс Data содержит имя, возраст, идентификатор. Теперь вопрос в том, как класс Data содержит эти данные. Специальные поля? Общий хэш-стол?

В любом случае, я думаю, что тот факт, что у вас есть какой-то "общий" код (класс поиска) и вам нужно создавать специальные формы, является плохим паттерном. Вы должны использовать некоторую платформу MVC, которая автоматически заполняет вашу конкретную форму. Затем запустите логику поиска, используя данные формы. если у вас есть общая логика для обоих режимов, реализуйте ее либо в абстрактном классе, либо в служебном классе.

1 голос
/ 17 августа 2011

Я не вижу ничего плохого в вашем нынешнем подходе. Вы можете использовать enum, чтобы избежать сравнения строк, как в следующем примере:

public enum SearchMode {
    A {
        @Override
        public Form createForm(Data data) {
            SearchFormA form = new SearchFormA();
            form.setName(...);
            populateCommon(form, data);
            return form;
        }
    },
    B {
        @Override
        public Form createForm(Data data) {
            SearchFormB form = new SearchFormB();
            form.setAge(...);
            populateCommon(form, data);
            return form;
        }
    };

    public abstract Form createForm(Data data);

    public void populateCommon(Form form, Data data) {
        // Set common properties
        form.setId(...);
    }

    public static Form createForm(String searchMode, Data data) {
        return SearchMode.valueOf(searchMode).createForm(data);
    }
}
0 голосов
/ 18 августа 2011

Чего вы явно пытаетесь избежать, так это того, что в методе поиска вам придется добавлять в структуру if (код спагетти).

Мне кажется, что описываемая вами ситуация не сильно отличается от той, которую я написал для этого ответа .Это будет означать, что стратегия и шаблон (и другие) могут пригодиться здесь.

Cheers, Wim

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...