Шаблон метода 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();