静态类的模板方法模式

mis*_*off 6 java design-patterns template-method-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
    }
}
Run Code Online (Sandbox Code Playgroud)

该类具有doWork执行大量计算的方法.顺便说一句,方法调用helper方法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
}
Run Code Online (Sandbox Code Playgroud)

什么是更好的设计解决方案可以应用于解决这个问题?有没有办法实现像Template Patternhas 一样的灵活性,但是在util类的应用程序中.

提前致谢.

Arn*_*jar 5

我的建议受到Command Pattern的启发,其中Util类是一个Invoker,每个doWork-help对都是使用Worker接口封装的.

工人界面可能有点像

public interface Worker {
    public void doWork();
    public int help();
}
Run Code Online (Sandbox Code Playgroud)

Util类

public final class Util {
    private Util() { }

    public static void toWork(Worker worker){
        worker.doWork();
    }

}
Run Code Online (Sandbox Code Playgroud)

混凝土工人(帮助和工作的实施)

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

另一名工人

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

和执行

Util.toWork(new ConcreteWorker());
Util.toWork(new ConcreteWorker2());
Run Code Online (Sandbox Code Playgroud)