gpt4 book ai didi

java - 静态类的模板方法模式

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:10:08 24 4
gpt4 key购买 nike

我有一个执行某些工作的实用程序类。显然,它对扩展是封闭的,所有方法都是静态的。为了简单起见,该类如下所示:

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 那样的灵 active ,但在应用到 util 类时。

提前致谢。

最佳答案

我的建议灵感来自 Command Pattern ,其中 Util 类是一个 Invoker,每个 doWork-help 对都使用 Worker 接口(interface)封装。

Worker Interface 可能有点像

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

实用类

public final class Util {
private Util() { }

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

}

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

}

另一个 worker

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());

关于java - 静态类的模板方法模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16236857/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com