为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕桂英3389331 2022-06-08 16:57:16
我正在尝试实现模板方法模式,但我需要一些我认为不是最佳实践的细微变化。我有以下类结构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 个类,其中一个不需要在第二步中实现。我不认为将方法留空将是一个好习惯。我想在其中发表评论(说不需要实施),但我不认为这是正确的解决方案。还有另一种我没有看到的方法吗?
查看完整描述

3 回答

?
ITMISS

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

   }

}


查看完整回答
反对 回复 2022-06-08
?
沧海一幻觉

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 { }


查看完整回答
反对 回复 2022-06-08
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

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



查看完整回答
反对 回复 2022-06-08
  • 3 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号