Вы можете иметь RecordValidationVisitor
и RecordDaoVisitor
, которые "посещают" каждый тип записи соответственно. Таким образом, вы можете свободно комбинировать вещи, которые обрабатывают записи, как вы хотите.
Вы определите своего посетителя следующим образом:
interface RecordVisitor {
void visitRecordA(value: RecordA)
void visitRecordB(value: RecordB)
}
, а ваши классы как:
class RecordA {
void accept(visitor: RecordVisitor) {
visitor.visitRecordA(this)
}
}
И затем вы можете иметь следующих посетителей:
class RecordDaoVisitor extends RecordVisitor {
void visitRecordA(value: RecordA) {
recA_dao.create(value);
}
void visitRecordB(value: RecordB) {
recB_dao.create(value);
}
}
class RecordDaoVisitor extends Visitor {
// Implementation...
}
И, наконец, вы можете использовать их следующим образом:
var record = ??? // RecordA or RecordB doesn't matter
record.accept(recordDaoVisitor);
record.accept(recordValidationVisitor);
имеет несколько преимуществ по сравнению с вашим текущим подходом:
instanceof
проверки требуют больших затрат).visitRecordC
к вашему RecordVisitor
, то вы получите ошибки компиляции в куче мест, где вам нужно реализовать обработчик для нового варианта.