受保护的"存根"方法仅用于重写目的,是否为良好做法?

aio*_*obe 7 java oop inheritance

有时当我扩展自己的一个类时,我想(为了子类的目的)在超类中的方法中"注入"一行或两行代码.

在这些情况下,我有时会添加一个空的受保护方法的调用,以便子类重写.

public void superClassMethod() {

    // some fairly long snippet of code

    doSubclassSpecificStuff();

    // some other fairly long snippet of code

}

// dummy method used for overriding purposes only!
protected void doSubclassSpecificStuff() {
}
Run Code Online (Sandbox Code Playgroud)

当我在同一个班级多次这样做时,我必须说它看起来很尴尬/丑陋所以我的问题:

  1. 对于子类来说,这种"开放"的方式是在被认为是良好实践的方法中间"注入"代码吗?
  2. 模式(反模式?)被称为什么?
  3. 它是否已用于任何众所周知的API /库?(注意,我在谈论非抽象类.)
  4. 还有更好的选择吗?

我能想到的唯一选择是使用类似命令模式的东西setMiddleOfMethodHandler(SomeRunnableHandler),然后调用handler.doSubclassSpecificStuff()而不是使用伪方法.我看到它有一些缺点,例如无法触及受保护的数据.

Joh*_*ley 9

您刚刚发现了模板方法设计模式.请注意,通常构成各个步骤的方法是抽象的(而不是空的和受保护的),因此子类必须覆盖它们.