我想实现模板方法模式,但我需要一个微小的变化,我不认为这是最好的做法。我的班以下结构
abstract class AbsClass {
public void algorithm(){
step1();
step2();
}
private void step1() {
//implementation
}
protected abstract void step2();
}
class A extends AbsClass {
protected void step2() {
// With implementation
}
}
class B extends AbsClass {
protected void step2() {
// No implementation needed
}
}
在现实情况下,我喜欢有4类,其中一人并不需要有执行第二步。我不认为离开法空将是很好的做法。我的想法是把评论(说有没有必要实现)在里面,但是我没有,这将是正确的解决方案。是否有另一种方法我没有看到?
我同意@Vinay Avasthi的答案,但我想加固。
挂钩方法在基类中定义,是一个默认的实现。这些可以被覆盖 - 他们不必。
从Template-Method-Pattern Wikipedia页:
模板方法的抽象类也可以定义可以由子类所覆盖钩方法。这些都在抽象类无操作实现,但提供在其上“挂”实现一个“钩”。
你应该做的是留在方法的身体像// empty method body
评论让别人读你的代码(也许你自己)都知道,这种方法并没有被遗忘
还有就是在Java中实现模板的方法,模式的第二种方式。由于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 { }
我认为这是绝对的罚款。如果第二步的默认行为是什么都不做,那么你可以在基类中的空方法和子类中重写。
我们不应该强迫的设计模式。在这里,如果我们喜欢在组成然后继承其更好。
目前在这个问题的代码,我们在一个类中定义的方法,但实际上方法有没有问题。强制在一类的地方不应该belomg到是不是一个好主意的方法。
下面就是这样的一个可能的实现,你不会强迫的方法的一类,如果它不属于它。下面是基于策略行话,但我仍然要说遵循的设计原则,让图案本身适合您的问题,不要强迫模式适合您的解决方案。
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
}
}