使用Java 8的模板方法设计模式

use*_*534 4 java design-patterns java-8 default-method

我想使用java 8新的默认方法重构模板方法.假设我在抽象类中定义了一个流程:

public abstract class FlowManager{
    public void startFlow(){
        phase1();
        phase2();
    }
    public abstract void phase1();
    public abstract void phase2();
}
Run Code Online (Sandbox Code Playgroud)

我有几个子类扩展上面的流管理器,每个子类实现自己的phase1phase2mathod.我想知道将代码重构为这样的接口是否有意义:

public interface FlowManager{
    public default startFlow(){
        this.phase1();
        this.phase2();
    }
    public void phase1();
    public void phase2();
}
Run Code Online (Sandbox Code Playgroud)

你怎么看?

Stu*_*rks 10

使用带有默认方法的接口来实现模板方法模式对我来说似乎很可疑.

默认方法通常(但并非总是)旨在被实现者覆盖.如果接口的默认方法被用作模板方法,则重写方法将容易受到编程错误的影响,例如不调用super方法,在错误的时间调用它,更改调用阶段的顺序等等.这些都是模板方法模式旨在避免的编程错误.

通常,模板方法不应被覆盖.在Java类中,可以通过制作该方法来发出信号final.接口不能有最终方法; 看到这个问题的理由.因此,最好使用带有final方法的抽象类作为模板来实现模板方法模式.