我正在开发一个项目,我们有一个抽象类(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
}
....
....
}
解决方法:
它实际上是一种名为GoF的模板方法的设计模式.但是,你不应该过度应用它,因为它有利于继承而不是组合.
Define the skeleton of an algorithm in an operation, deferring some
steps to subclasses. Template Method lets subclasses redefine certain
steps of an algorithm without changing the algorithm’s structure.
您会发现这种模式在许多已知的框架和插件中实现.但是,在某些情况下,您应该考虑不同的模式,如策略或装饰器.
例如,虽然策略模式使用委托来改变整个算法,但模板方法使用变形继承来改变算法的特定部分.策略还在运行时修改单个对象的逻辑,而模板方法通过子类化在编译时修改整个类的逻辑.
关于“最佳实践” – 这是一个有争议的术语.我相信当代码库增长时,应该替换模板方法以支持更好的设计模式,并且需要重构以获得更好的复杂性.
但有时它是满足您需求的最佳解决方案.例如,您可能有doExecute()方法,并希望其他程序员扩展您的类(而不是修改它),因此您可以让它们挂钩代码中提供beforeExecute()方法的部分.如果我们谈论各种对象的组合,成熟系统可能包括事件调度员功能.
标签:c,java,oop,design-patterns
来源: https://codeday.me/bug/20190623/1273163.html