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类的应用程序中.
提前致谢.
我的建议受到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)
| 归档时间: |
|
| 查看次数: |
1306 次 |
| 最近记录: |