Шаблон метода pattern для статических классов
у меня есть класс util, который выполняет некоторую работу. Очевидно, что он закрыт для расширения, и все методы статичны. Для простоты, класс выглядит так:
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
это выполняет много вычислений. Кстати, метод вызывает helper method help
для получения некоторого результата и остальной части кода используйте результат, возвращенный help
метод.
теперь в клиентском коде я хочу повторно использовать функциональность метода doWork
, но вместо того, чтобы позвонить help
Я хочу позвонить help2
метод. Самое простое решение просто создать метод doWork2
С заменой help
to 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
имеет, но в приложении к классам util.
спасибо заранее.
3 ответов
мое предложение вдохновлено в Команда, где класс Util является вызывающим, и каждая пара doWork-help инкапсулируется с помощью рабочего интерфейса.
рабочий Inteface может быть как
public interface Worker {
public void doWork();
public int help();
}
Класс Util
public final class Util {
private Util() { }
public static void toWork(Worker worker){
worker.doWork();
}
}
бетонщик (реализации help и doWork)
public class ConcreteWorker implements Worker{
@Override
public void doWork() {
// TODO Auto-generated method stub
int variable = help();
}
@Override
public int help() {
// TODO Auto-generated method stub
return 0;
}
}
Другой Работник
public class ConcreteWorker2 implements Worker{
@Override
public void doWork() {
// TODO Auto-generated method stub
int variable = help();
}
@Override
public int help() {
// TODO Auto-generated method stub
return 1;
}
}
и исполнение
Util.toWork(new ConcreteWorker());
Util.toWork(new ConcreteWorker2());
вы можете создать 2 статических объекта Help1
& Help2
реализация Help
интерфейс, у которого есть метод help () и измените свой метод doWorkWithParameter следующим образом:
public static void doWorkWithParameter(Help h) {
int variable = h.help();
}
это тесно связано с вашим текущим решением. Но я думаю, что это немного более "объектно-ориентированный".
не так давно я сделал это:
public static enum Helper{
OLD(){
public int help(){
return 0;
}
},
NEW(){
public int help(){
return 1;
}
};
public abstract int help();
public void doWork() {
int variable = help();
}
}
public static Helper HELPER = Helper.NEW;
тогда мы можем позвонить:
Constants.HELPER.doWork()
переключая значения констант помощника, я могу изменить поведение. или вы можете сделать:
Helper.OLD.doWork();
Helper.NEW.doWork();