6

我有一个执行一些工作的 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执行大量计算的方法。顺便说一句,方法调用辅助方法help来获取一些结果,其余代码使用help方法返回的结果。

现在,在客户端代码中我想重用 method 的功能doWork,但不是调用help我想调用help2method. 最简单的解决方案只是创建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,但在应用程序类中。

提前致谢。

4

3 回答 3

5

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

工人接口可能有点像

public interface Worker {
    public void doWork();
    public int help();
}

实用程序类

public final class Util {
    private Util() { }

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

}

The Concrete Worker(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());
于 2013-04-26T12:59:55.917 回答
1

您可以创建 2 个静态对象Help1Help2实现Help接口,其中有一个 help() 方法并像这样更改您的 doWorkWithParameter 方法:

public static void doWorkWithParameter(Help h) {
    int variable = h.help();
}

它与您当前的解决方案密切相关。但我认为它更像是“面向对象”。

于 2013-04-26T12:56:36.580 回答
1

不久前我做了这个:

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 常量值,我可以改变行为。或者你可以这样做:

Helper.OLD.doWork();
Helper.NEW.doWork();
于 2013-04-26T12:56:57.357 回答