Пытаюсь разобраться, как смоделировать понятие значений по умолчанию в иерархии объектов. Эти значения по умолчанию должны применяться ко всем объектам в иерархии, если только объект не переопределяет настройку. Если параметр переопределен, он и все его дочерние элементы получат переопределенное значение, но другие значения будут извлечены из иерархии вверх.
Может быть, пример поможет. Рассмотрим систему, которая моделирует планирование спортивных игр. На вершине находится спортивный объект. Этот объект содержит набор лиг, а лига содержит набор сезонов. Сезон содержит набор расписаний, а график содержит набор игр:
class Sport {
private Set<League> leagues;
}
class League {
private Set<Season> seasons;
}
class Season {
private Set<Schedule> schedules;
}
class Schedule {
private Set<Game> games;
}
class Game {
}
Возможно, есть объект по умолчанию, который выглядит примерно так:
class Defaults {
private Set<Venue> venues;
private Set<Weekday> weekdays;
private int gameDuration;
private Set<RefereePositions> requiredRefereePositions;
}
Таким образом, объекту «Спорт» для «Футбол» будет принадлежать объект «По умолчанию», в котором указано:
venues: ["Field 1","Field 2", "Field 3", "Field 4", "Field 5"}
weekdays: ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"]
gameDuration: 90
requiredRefereePositions: ["Referee","Linesman 1","Linesman 2"]
Тогда Лига может переопределить эти настройки, возможно:
venues: ["Field 4","Field 5"]
weekdays: ["Sat","Sun"]
Сезон может переопределить настройки, как и расписание. Возможно, определенный график игр предназначен для игр низкого уровня и требует только одного судьи. Так что Расписание может переопределить значения по умолчанию с помощью:
requiredRefereePositions: ["Referee"]
Таким образом, это означает, что, когда система планирования запускается и пытается запланировать Игру в рамках этого Расписания, она будет знать, что игра должна быть запланирована на «Поле 4» или «Поле 5», должна быть на СБ или ВС , должно быть 90 минут и иметь одного судью:
venues: ["Field 4","Field 5"]
weekdays: ["Sat","Sun"]
gameDuration: 90
requiredRefereePositions: ["Referee"]
Что было бы хорошим способом смоделировать это? Существует ли существующий шаблон дизайна для него? Я пытался найти решения для Google, но мне сложно выбрать правильные ключевые слова. Если кто-то может указать мне на онлайн-ресурс или примеры этого, я был бы очень признателен! Я реализую это на Java, но буду смотреть на примеры во всем.
Одна технология, о которой я могу подумать, похожа на то, как работает CSS в браузере. Значения располагаются вниз по иерархии, причем каждый узел может переопределять значения сверху. Будет ли это правильный подход? Как бы я смоделировать это на Java? Как бы я сохранил это и запросил его через Hibernate?
Мое последнее беспокойство заключается в том, как обращаться с настройками по умолчанию, которые относятся только к определенному набору объектов в иерархии. Например, в CSS значение «ширина», вероятно, не имеет смысла для элемента «скрипт». В CSS эта настройка, вероятно, просто игнорируется, но если бы я это сделал, мой объект по умолчанию был бы таким большим классом со всеми возможными настройками, которые могут понадобиться любому объекту в системе. Что означает «requiredRefereePositions» для объекта Venue? Не уверен, что это лучший путь.