Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 空方法是否破坏了模板方法模式的结构?_Java_Oop_Design Patterns_Template Method Pattern - Fatal编程技术网

Java 空方法是否破坏了模板方法模式的结构?

Java 空方法是否破坏了模板方法模式的结构?,java,oop,design-patterns,template-method-pattern,Java,Oop,Design Patterns,Template Method Pattern,在模板方法模式中,我们有一个抽象定义的超类。我们有具体的类来扩展这个类 假设我们向模板方法添加了一个新函数,并在某些子类中重写它(仅用于某些类)。我们在其他类中将这个新方法重写为空(函数没有主体) 此操作是否算作代码重复 public void template(){ doX(); doY(); doZ(); } public void template(){ doX(); doY(); doA(); doZ(); } 例如,在模板方

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

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

此操作是否算作代码重复

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

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

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

如果我将此函数添加到模板方法并在Class2 empty中重写此函数。这算是代码重复吗

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

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

绝对不是。您可以从这本书中发现,模板方法模式中有两种类型的方法:

  • 抽象方法,它没有实现体,但等待子类重写它
  • hook方法,它只是一个空方法,这意味着您可以在需要时实现它,但它不是必需的

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