【问题标题】:Does empty method break the structure of template method pattern?空方法会破坏模板方法模式的结构吗?
【发布时间】:2018-12-05 21:17:02
【问题描述】:

在模板方法模式中,我们有一个定义为抽象的超类。我们有扩展这个类的具体类。

假设我们在模板方法中添加了一个新函数,并在一些子类中覆盖了它(仅在某些类中使用)。我们在其他类中将这个新方法覆盖为空(函数没有主体)。

这个操作算作代码重复吗?

例如,在模板方法中,我们有一个新函数 doA() (我坚持使用 doA() 作为钩子方法)。我只想在 Class1 和 doZ() 和 doY() 之间使用这个函数。

如果我将此函数添加到模板方法并在 Class2 中覆盖此函数为空。这算作代码重复吗?

public void template(){
    doX();
    doY();
    doZ();
}

public void template(){
    doX();
    doY();
    doA();
    doZ();
}

【问题讨论】:

  • 为什么要覆盖这个空而什么都不做?
  • 因为方法应该按顺序调用
  • 订单是什么意思?是在调用doA()之后首先调用doX()然后调用doZ()吗?方法也是抽象的吗?
  • 在我们调用“template()”时添加doA()函数之前,首先是doX(),然后是doY(),最后是doZ()方法。添加doA()函数后;当客户端调用 template() 时,我们的函数调用顺序将是 doX()、doY()、doA 和 doZ()。
  • 我建议只在模板类中将必要的方法标记为抽象。如果子类不一定需要特定方法,那么您可以尽可能编写基本实现。由于我不知道您要在子类中实现什么目标,因此很难回答这是否是多余的

标签: java oop design-patterns template-method-pattern


【解决方案1】:

绝对不是。你可以从gof23一书中找到模板方法模式中有两种方法:

  • abstract 方法,它没有实现主体但等待子类覆盖
  • hook 方法,它只是一个空方法,意思是你可以在需要的时候实现它,但不是必须的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-01
    • 2019-08-23
    • 2010-11-04
    • 1970-01-01
    • 2013-11-10
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多