猿问

模板模式,但其中一个类未实现该方法

我正在尝试实现模板方法模式,但我需要一些我认为不是最佳实践的细微变化。我有以下类结构


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 个类,其中一个不需要在第二步中实现。我不认为将方法留空将是一个好习惯。我想在其中发表评论(说不需要实施),但我不认为这是正确的解决方案。还有另一种我没有看到的方法吗?


慕桂英3389331
浏览 138回答 3
3回答

ITMISS

我们不应该强制设计模式。在这里,如果我们更喜欢组合而不是继承,那么它会更好。问题中的代码我们在类中定义了一个方法,但实际上方法没有行为。在不应该属于的类中强制使用方法不是一个好主意。下面是一种这样的可能实现,如果方法不属于某个类,您将不会强制它使用它。以下是基于策略模式的,但我仍然会说遵循设计原则,让模式本身适合您的问题,不要强迫模式适合您的解决方案。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   }}

沧海一幻觉

钩法挂钩方法在基类中定义,是默认实现。这些可以被覆盖 - 他们不必这样做。从模板-方法-模式维基百科页面:模板方法的抽象类也可以定义可能被子类覆盖的钩子方法。它们在抽象类中有一个无操作实现,但提供了一个“挂钩”,用于“挂起”实现。改进您应该做的是在方法主体中留下注释,// 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 { }

侃侃尔雅

我认为这绝对没问题。如果 step2 的默认行为是什么都不做,那么您可以在基类中有一个空方法并在子类中覆盖。
随时随地看视频慕课网APP

相关分类

Java
我要回答