Вопрос дизайна - шаблон шаблона с enum, реализующий интерфейс - PullRequest
2 голосов
/ 02 июня 2011

Мой код начинает выходить из-под контроля, поэтому я решил обратиться за помощью.

У меня есть класс enum, который реализует интерфейс. Первое, что делает метод, это получает соединение с БД из пула, используя jndi. Затем на основе свойств объектов выполняет серию вычислений и возвращает результат.

public interace MyInterface {  
     public ResultObject calculate(MyObject myObject); 

}

public enum MyEnum implements Myinterface {
    public ResultObject calculate(MyObject myObject) {
         //several steps
    }
}

Это работало нормально только с одним расчетом. Теперь у меня есть еще несколько способов расчета с несколькими изменениями, необходимыми для каждого расчета.

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

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

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

1 Ответ

3 голосов
/ 02 июня 2011

Меня действительно смущает, что у вас есть enum, который реализует такой интерфейс, особенно если enum отвечает за взаимодействие с базой данных - похоже, вы неправильно используете enum s.

Что касается самой проблемы, я бы создал базовый класс (потенциально абстрактный), который содержит основную логику метода calculate(MyObject) и делегирует «дополнительные способы» для вычисления либо абстрактному методу, либо защищенному методу override- возможность подклассами, так что вы можете иметь несколько разные реализации MyInterface, которые обеспечивают другое поведение.

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