2013-09-08 7 views
1

Мне нужно создать сложный объект конфигурации на основе значений параметров, которые я получаю.Ищете шаблон для создания и конфигурации классов на основе входных параметров

Мои входы - это две простые переменные и объект конфигурации. Сочетание 2-х переменных и внутренностей объекта конфигурационного будет определять конфигурацию выходного класса (который всегда тот же тип)

Делать это с простым, если-иначе он бы выглядеть следующим образом:

if (a == 1 && b == 1) { 
//do some testing on the input object, configure and return the output object 
else if (a == 2 && b == 1) { 
//do some different testing on the input, configure and return the output. 
} 

и дальше.

Существует около 5 различных значений, которые могут содержать & b и в зависимости от значений & b, мне нужно будет проверить разные вещи внутри входного объекта.

Я не уверен в лучшем способе решить эту проблему. Моя первая мысль должна иметь какой-то Command Pattern с методом, как:

public interface Command { 
    public OutputConfig execute(InputConfig config); 
} 

и хранить свои потенциальные & комбинации A B в Map<Pair<A,B>, Command> для поиска.

Я чувствую, что ищу какой-то шаблон Factory/Command/Builder, но не уверен в лучшем способе его реализации.

Заранее спасибо.

+0

Что такое A, B в паре? – arjacsoh

+0

@arjacsoh Значения enum – Will

+0

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

ответ

0

Я думаю, вам нужен Strategy Pattern. Вы определяете интерфейс с помощью метода:

interface Configure{ 

public YourObject excecute(YourObject o); 

} 

Вы реализуете интерфейс в различных формах, которые вы хотите, и вы объявляете его в качестве члена поля. Затем вы создаете соответствующий класс в соответствии со значениями переменных.

Если вы хотите сохранить объекты, воспользуйтесь Command Pattern.

Обновление: Хорошо, что в Software Enginneering обычно нет абсолютной истины.

С Command Pattern у вас уже есть класс, который выполняет некоторые задачи, и вы хотите сохранить их как объекты из класса, полученные из интерфейса, чтобы использовать их позже и т. Д. Я не считаю, что ваш случай требует такого подход, поскольку вам нужны только разные функциональные возможности, определенные как метод интерфейса. Strategy Pattern поэтому в вашем случае более элегантный подход.

+0

Не могли бы вы объяснить, как это отличается от моего метода execute() выше - возможно, я не был достаточно явным, поэтому я добавил объявление интерфейса над объявлением метода - я не вижу, как ваши добавляются к моему. – Will

+0

@Will: Посмотрите мое обновление – arjacsoh