Шаблон проектирования Нужно удалить серию If .. elses в инициализации объекта - PullRequest
1 голос
/ 04 августа 2011

Я пишу заявку, в которой будет несколько отделов, и для каждого отдела будет отдельный класс обработки.Каждый отдел и обработка отдела представлены отдельным классом.

, поэтому теперь основной метод в java больше похож на серию лестниц if else.

Есть ли способ сделать его более гибким, чтобыя могу добавить больше отделов и их классов обработки позже, не меняя изначально написанного класса ??

Я читал о шаблонах абстрактной фабрики, но есть ли какое-то иное решение, чем оно?

Ответы [ 5 ]

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

Создайте интерфейс для скрытия отделов, например «Отдел».Напишите ваш основной метод, например:

main() {
    String criteria = ...; // this is how we choose the department to use,
                           // and you probably don't want to use a String
                           // but some other, more expressive type
    for (Department department : departments) {
        if (department.supports(criteria)) {
            department.doWhatever();
        }
    }
}

Затем используйте внедрение зависимостей для заполнения коллекции departments.В зависимости от того, как вы его настроили, это может быть чистая конфигурация.

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

Использование шаблона проектирования «Фабрика» или «Абстрактная фабрика» будет первым шагом. Это вывело бы логику инициализации объекта из вашего основного кода и изолировало бы ее в фабричных классах. Таким образом, ваш основной код будет закрыт для модификации и открыт для расширения (a.k.a. Open Closed Principle ). Внесенные вами изменения будут изолированы в фабричных классах.

Если вы хотите сделать еще один шаг вперед, вы также можете использовать рефлексию. Примером может быть:

static Object createObject(String className) {
  Object object = null;
  try {
      Class classDefinition = Class.forName(className);
      object = classDefinition.newInstance();
  } catch (InstantiationException e) {
      System.out.println(e);
  } catch (IllegalAccessException e) {
      System.out.println(e);
  } catch (ClassNotFoundException e) {
      System.out.println(e);
  }
  return object;
}

С помощью этого кода вы можете просто создать объект, подобный этому:

public static void main(String[] args) {
    NewDepartment dep = (NewDepartment) createObject("yourpackage.NewDepartment");
}

Конечно, при использовании отражения есть компромисс . Это на ваше усмотрение, использовать его или нет.

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

Вы можете создать перечисление с полем для каждого состояния. Затем создайте абстрактный метод init() в перечислении и реализуйте его для каждого члена.

В вашем коде вы можете получить состояние, например, из файла свойств, а затем сказать State.valueOf(state).init()

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

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

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

Для добавления нового отдела потребуется новый класс отделов, класс процессора и обновление заводской логики.


В качестве альтернативы, если структура отделов одинакова, но обработка различна, вы можете использовать что-то вроде шаблона Стратегии. В этом случае у вас есть один отдел, но вместо него будет принято решение об обработке для Стратегии. Таким образом, соответствующая Стратегия вводится в отдел, и поведение отдела соответственно различается.

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

Существует целый веб-сайт, посвященный этой теме.Вы хотите использовать полиморфизм и, возможно, отражение в зависимости от того, что вы пытаетесь сделать.

http://www.antiifcampaign.com/

...