我遇到了一个情况,需要扩展给定类的功能,但我不确定最好的方法是什么。我一开始采用了“向上”调用功能的方式,现在已经切换到“向下”方式,但我认为两种方法都存在问题。让我解释一下我的意思。首先,“向上”方法:
public class ParentValidator
{
public void validate() {
// Some code
}
}
public class ChildValidator extends ParentValidator
{
@Override
public void validate() {
super.validate();
// Some code
}
}
public class GrandchildValidator extends ChildValidator
{
@Override
public void validate() {
super.validate();
// Some code
}
}
这个功能完全正常,但需要我始终记得在方法体中放置super.validate(),否则父类逻辑将不会被执行。此外,通过这种方式进行扩展可能被认为是“不安全的”,因为子类实际上可以替换/修改在父类中定义的代码。这就是我所说的向上调用方法,因为我在不断地从更高级别的类中调用方法。
为了弥补这些缺点,我决定将ParentValidator.validate()设为final,并让它调用另一个方法。以下是我修改后的代码:
public class ParentValidator
{
public final void validate() {
// Some code
subValidate();
}
protected void subValidate() {}
}
public class ChildValidator extends ParentValidator
{
@Override
public final void subValidate() {
// Some code
subSubValidate();
}
protected void subSubValidate() {}
}
public class GrandchildValidator extends ChildValidator
{
@Override
public void subSubBalidate() {
// Some code
subSubSubValidate();
}
protected void subSubSubValidate();
}
这是我所说的每个类在继承链“向下”调用其他类方法时,我所参考的内容。
使用这种方法,我可以保证父类中的逻辑将被执行,我很喜欢。然而,它不太可扩展。继承层次越多,代码就变得越丑陋。在一层级别上,我认为这非常优雅。在两个层级上,开始看起来粗糙了。在三个或更多层级上,它是丑陋的。
此外,就像我必须记住要在任何子类的validate方法的第一行调用super.validate()一样,现在我必须记住在任何父类的validate方法的末尾调用某些“subValidate”方法,因此似乎并没有变得更好。
我是否有其他未涉及到的更好的扩展方式?这两种方法都有一些严重的缺陷,我想知道是否有更好的设计模式可供使用。