3 回答

TA贡献1871条经验 获得超8个赞
我们不应该强制设计模式。在这里,如果我们更喜欢组合而不是继承,那么它会更好。
问题中的代码我们在类中定义了一个方法,但实际上方法没有行为。在不应该属于的类中强制使用方法不是一个好主意。
下面是一种这样的可能实现,如果方法不属于某个类,您将不会强制它使用它。以下是基于策略模式的,但我仍然会说遵循设计原则,让模式本身适合您的问题,不要强迫模式适合您的解决方案。
public class AlgorithmClass {
private Strategy strategy;
public void setStrategy(Strategy strategy){
this.strategy = strategy;
}
public void algorithm(){
step1();
step2();
}
private void step1() {
//implementation
}
private void step2(){
if(this.strategy != null){
this.strategy.execute();
}
}
}
public interface Strategy{
public void execute();
}
public class Strategy1 implements Strategy{
public void execute(){
//implement your one of the stategies for step 2
}
}
public class Strategy2 implements Strategy{
public void execute(){
//implement your another stategy for step 2
}
}

TA贡献1824条经验 获得超5个赞
钩法
挂钩方法在基类中定义,是默认实现。这些可以被覆盖 - 他们不必这样做。
从模板-方法-模式维基百科页面:
模板方法的抽象类也可以定义可能被子类覆盖的钩子方法。它们在抽象类中有一个无操作实现,但提供了一个“挂钩”,用于“挂起”实现。
改进
您应该做的是在方法主体中留下注释,// empty method body
以便阅读您的代码的人(也许是您自己)知道该方法没有被遗忘
Java 的默认方法
还有第二种方法可以在 Java 中实现 Template-Method-Pattern。从 Java 8 开始,可以在接口中使用默认方法实现。
如果您的方法不依赖于状态,它可能如下所示:
interface AbsClass {
default void algorithm(){
step1();
step2();
}
default void step1() {
// implementation or empty
}
default void step2() {
// empty body in default case
}
}
class B implements AbsClass { }
添加回答
举报