【发布时间】:2022-10-04 17:29:28
【问题描述】:
我有以下用例。我有一个限制接口,需要从依赖项中填充其成员,进行验证。这些方法适用于所有实现,因此到目前为止都很好。某些限制需要稍后进行其他验证。在主函数中,我想遍历每个限制并以一般方式调用方法,而不是使用 instanceOf 然后调用。我认为这可能是here 提到的访问者模式的一个用例。现在我有以下课程。
interface Restriction() {
void fillFields();
void firstRoundValidation();
void accept(SecondRoundValidationVisitor secondRoundValidationVisitor);
}
class RestrictionBasic implements Restriction {
Field field;
// Inject dependencies
@Override
void fillFields() {
// Get field from dependencies
}
void firstRoundValidation() {
// Implement
}
@void accept(SecondRoundValidationVisitor secondRoundValidationVisitor) {
secondRoundValidationVisitor.visitRestrictionBasic(this);
}
}
class RestrictionAdvanced implements Restriction {
// Same as above except below function.
@void accept(SecondRoundValidationVisitor secondRoundValidationVisitor) {
secondRoundValidationVisitor.visitRestrictionAdvanced(this);
}
}
interface ValidationVisitor {
void visitRestriction(RestrictionBasic restrictionBasic);
void visitRestriction(RestrictionAdvanced restrictionAdvanced);
}
class SecondRoundValidationVisitor implements ValidationVisitor {
@Override
void visitRestriction(RestrictionBasic restrictionBasic) {
// Empty function
}
@Override
void visitRestriction(RestrictionAdvanced restrictionAdvanced) {
// Perform second level of validation
}
}
class Main() {
List<Restriction> restrictionList = new ArrayList();
ValidationVisitor validationVisitor = new SecondRoundValidationVisitor();
for (restriction : restrictionList) {
restriction.accept(validationVisitor)
}
}
你能告诉我这种方法是否有任何问题吗?还有另一种方法,可以将 getSecondValidationNeeded() 添加到接口中,并在此基础上调用带有空正文默认值的 secondValidation。但这不遵循接口隔离原则。我的疑问是访问者模式如何解决这个问题?即使在访问者模式中,也只有一个界面,并且即使只有部分访问者具有非空访问功能,也会在基本界面中添加接受。
【问题讨论】:
标签: java oop inheritance design-patterns visitor-pattern