У меня есть служебный класс, который выполняет некоторую работу. Очевидно, он закрыт для расширения и все методы статичны. Для простоты класс выглядит так:
public final class Util {
private Util() { }
public static void doWork() {
// some work
int variable = help();
// some work uses variable
}
private static int help() {
// some helper functionality
}
}
В классе есть метод doWork
, который выполняет множество вычислений. Кстати, метод вызывает вспомогательный метод help
для получения некоторого результата, а остальная часть кода использует результат, возвращенный методом help
.
Теперь в клиентском коде я хочу повторно использовать функциональность метода doWork
, но вместо вызова help
я хочу вызвать метод help2
. Самое простое решение - просто создать метод doWork2
с заменой help
на help2
.
Это очень плохой подход, потому что каждое изменение в doWork
должно быть реплицировано и в doWork2
. Это очень похоже на шаблон Template Method
, но из-за того, что у нас здесь нет расширения, мы не можем его применить.
Лучшее решение, которое я придумал, - добавить параметр к этому методу, но сохранить всех существующих пользователей doWork
:
public static void doWork() {
doWorkWithParameter(true);
}
public static void doWorkWithParameter(boolean helpOrHelp2) {
// some work
int variable = helpOrHelp2 ? help() : help2();
// some work uses variable
}
Какие лучшие дизайнерские решения можно применить для решения этой проблемы? Есть ли способ добиться такой гибкости, как у Template Pattern
, но в применении к классам.
Заранее спасибо.
public static void doWork() {...}
public static void doWork(boolean param) {...}
- person Crazenezz   schedule 26.04.2013public static void doWork(int variable)
. Хотя я подозреваю, что реальный ответ заключается в том, что путаница вызвана статикой и что объекты дадут более четкий ответ - хотя трудно сказать с абстрактными примерами. - person Nick Holt   schedule 26.04.2013