我正在开发一个项目,我们有一个抽象类(BaseConverter
),它有一个抽象方法(convert()
)和几个具体的方法。一个重要的具体方法是invokeConverter()
,它基本上会调用子类中实现的convert()
方法。
虽然我们的代码正在被其他人审查,但他告诉我,不应该从超类调用子类方法,他告诉这不是最佳实践。以下是我们的课程结构。有人可以告诉我这是不是一种正确的方法吗?
@Named
public abstract class BaseConverter{
@Inject
private ConversionDriver conversionDriver;//this class is responsible to return the correct subclass object based on the type
protected abstract String convert(Object toConvert);
public String invokeConverter(ConverterType type, Object toConvert){
conversionDriver.getConverter(type).convert(toConvert);//getConverter() return the subclass object based on the type
}
....
....
}
答案 0 :(得分:4)
它实际上是GoF的一种名为模板方法的设计模式。但是,你不应该过度应用它,因为它有利于继承而不是组合。
在操作中定义算法的骨架,推迟一些 子类的步骤。模板方法允许子类重新定义 算法的步骤而不改变算法的结构。
你会发现这个模式在许多已知的框架和插件中实现。但是,在某些情况下,您应该考虑不同的模式,如策略或装饰器。
例如,虽然策略模式使用委托来改变整个算法,但模板方法使用解除的继承来改变算法的特定部分。策略还在运行时修改单个对象的逻辑,而模板方法通过子类化在编译时修改整个类的逻辑。
关于“最佳实践” - 这是一个有争议的术语。我相信当代码库增长时,应该替换模板方法以支持更好的设计模式,并且需要重构以获得更好的复杂性。
但有时它是满足您需求的最佳解决方案。例如,您可能有doExecute()
方法,并希望其他程序员扩展您的类(而不是修改它),因此您可以让它们挂钩代码中提供beforeExecute()
方法的部分。如果我们谈论各种对象的组合,成熟的系统可能包括事件调度员功能。